알고리즘/알고리즘 문제풀이
백준) 투포인터, 슬라이드윈도우, 누적합
lusida0131
2022. 5. 17. 13:11
728x90
백준 11728번 배열 합치기
잘못된 풀이
import java.io.*;
import java.util.*;
public class Baek11728 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int aSize = Integer.parseInt(st.nextToken());
int bSize = Integer.parseInt(st.nextToken());
ArrayList<Integer> list = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int i = 0; i < aSize; i++) {
list.add(Integer.parseInt(st.nextToken()));
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i < bSize; i++) {
list.add(Integer.parseInt(st.nextToken()));
}
Collections.sort(list);
System.out.println(list);
}
}
잘못된 풀이
import java.io.*;
import java.util.*;
public class Baek11728 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int aSize = Integer.parseInt(st.nextToken());
int bSize = Integer.parseInt(st.nextToken());
int [] aArr = new int[aSize];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < aSize; i++) {
aArr[i] = Integer.parseInt(st.nextToken());
}
int [] bArr = new int [bSize];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < bSize; i++) {
bArr[i] = Integer.parseInt(st.nextToken());
}
int lt = 0;
int rt = 0;
ArrayList<Integer> list = new ArrayList<>();
while(rt < aSize && lt < bSize) {
if(aArr[rt] > bArr[lt]) {
list.add(bArr[lt]);
lt++;
}
else if(aArr[rt] < bArr[lt]) {
list.add(aArr[rt]);
rt++;
}
else {
lt++;
rt++;
}
}
while(rt < aSize) {
list.add(aArr[rt]);
rt++;
}
while(lt < bSize) {
list.add(bArr[lt]);
lt++;
}
System.out.println(list);
}
}
내가 생각한 풀이 해설
배열을 리스트에 담아서 출력하는 방법을 생각했다.
하지만 시간 초과가 나왔다. 다른 방식으로 투포인터 알고리즘으로 풀었는데도 시간 초과가 나왔다.(?)
계속 바꿔도 시간초과가 나왔는데 그 이유는 마지막에 정답을 출력할 때System.out.print를 사용하면 시간 초과가 나는 것이었다.
이것 때문에 시간을 많이 썼다.
정확한 풀이
import java.io.*;
import java.util.*;
public class Baek11728 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int aSize = Integer.parseInt(st.nextToken());
int bSize = Integer.parseInt(st.nextToken());
ArrayList<Integer> list = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int i = 0; i < aSize; i++) {
list.add(Integer.parseInt(st.nextToken()));
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i < bSize; i++) {
list.add(Integer.parseInt(st.nextToken()));
}
Collections.sort(list);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int i = 0; i < list.size(); i++) {
bw.write(list.get(i) + " ");
}
br.close();
bw.close();
}
}
백준 21921번 블로그
문제점
for문에서 max를 구할 때 크기만큼 달라지는 합해주는 값이 달라지는 것과 count에서 어려움을 느꼈습니다.
for문 안에서 while과 if로 처리해주는 것에 대한 이해가 필요할 것 같습니다.
정확한 풀이
import java.io.*;
import java.util.*;
public class Baek21921 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int [] arr = new int [n];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int end = 0;
int sum = 0;
int max = 0;
int count = 1;
for(int i = 0;i < n; i++){
while((end - i < m) && end < n){
sum += arr[end];
end++;
}
if(max == sum){
count++;
}
else if(max < sum){
max = sum;
count = 1;
}
sum -= arr[i];
}
if(max == 0){
System.out.println("SAD");
return;
}
System.out.println(max);
System.out.println(count);
}
}
백준 3273번 두 수의 합
내가 생각한 풀이
어제 풀었던 투포인터 알고리즘을 사용해서 풀면 쉽게 풀리는 문제였다.
정확한 풀이
import java.io.*;
import java.util.*;
public class Baek3273 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int [] arr = new int [n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int m = Integer.parseInt(br.readLine());
int i = 0;
int j = n - 1;
int cnt = 0;
Arrays.sort(arr);
while(i < j) {
if(arr[i] + arr[j] == m) {
cnt++;
i++;
j--;
}
else if(arr[i] + arr[j] < m) {
i++;
}
else {
j--;
}
}
System.out.println(cnt);
}
}
백준 14706번 구간 합 최대
문제점
위에 문제는 아직 해결을 하지 못했다. 고민을 많이 해봐야 될 것 같다. 또한 코드를 참고하려고 해도 아직까지 블로그에 올리신 분이 없습니다.
백준 2167번 2차원 배열의 합
내가 생각한 풀이
이와 비슷한 문제를 푼 적이 있어서 오래 걸리지는 않았다. 처음에 이 문제를 접했을 때 구간에서 다음 구간까지 더해주는 것에서 방법을 떠올리기 힘들었다.
정확한 풀이
import java.io.*;
import java.util.*;
public class Baek2167 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int [][] arr = new int [n + 1][m + 1];
for(int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 1; j <= m; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
int k = Integer.parseInt(br.readLine());
int sum;
for(int i = 0; i < k; i++) {
st = new StringTokenizer(br.readLine());
sum = 0;
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
for(int j = x1; j <= x2; j++) {
for(int t = y1; t <= y2; t++) {
sum += arr[j][t];
}
}
System.out.println(sum);
}
}
}
오늘의 회고
오늘은 시간 초과 문제로 시간을 많이 소비했습니다. 시간 초과가 났을 때 알고리즘 문제가 아니라 출력해주는 부분에도 시간초과가 날 수 있다는 것을 배웠습니다. 또한 아직도 투포인터에서 이해하지 못한 부분이 있습니다. 자료를 계속 찾아서 공부하고 이해하려고 노력해야 될 것 같습니다. 또한 오늘 해결하지 못한 문제는 내일 이어서 고민해보고 내일은 책에 연습문제 4문제를 풀겠습니다.
728x90