[3273] 두 수의 합

않새준·2025년 2월 9일
post-thumbnail

[백준 3273]
https://www.acmicpc.net/problem/3273

입력받은 수열 중 두개의 요소값의 합이 입력받은 X와 크기가 같은 쌍의 크기를 구하는 문제이다.

해당 문제도 요구하는 시간이 널널하지 않으므로 전에 학습했던 BufferedReader와 BufferedWriter를 적극적으로 사용해서 실행시간을 줄여보고자 하였다.

문제를 풀기 위해서 2중 for문을 사용하여 첫번째 반복문에서는 인덱스를 고정하고 두번째 반복문에서는 고정한 인덱스보다 큰 인덱스를 순회하며 해당 쌍을 찾고자 하였다.


🔧알고리즘 작성

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
        
        // 입력 3인방
        int size = Integer.parseInt(br.readLine());
        String[] temp = br.readLine().split(" ");
        int sum = Integer.parseInt(br.readLine());
        
        int list[] = new int[size];
        int cnt = 0;
        
        for (int i = 0; i < size; i++) {
        	list[i] = Integer.parseInt(temp[i]);
        }
        
        for(int j = 0; j < size - 1; j++) {
        	for(int k = j + 1; k < size; k++) {
        		if(list[j] + list[k] == sum) {
        			cnt++;
        			break;
        		}
        	}
        }
        bw.write(cnt + "\n");

        br.close();
        bw.flush(); 
        bw.close();
    }
}

BufferedReader는 문자열을 입력받아 직접 형변환 과정을 수행해야 한다.

그렇기에 띄어쓰기로 구분하여 한줄로 입력받은 수열을 배열에 저장하기 위해서 공백을 기준으로 문자열로 배열에 집어넣고 정수형으로 변환하는 후처리 과정을 수행하였다.

이후 2중 for문을 사용하여 인덱스별로 순회하며 특정값에 맞는 쌍을 찾아내고 조건에 맞을 시 횟수를 저장하는 변수를 증가시켰다.

이때 break; 를 사용하지 않고 답안 제출 시 시간초과로 오답처리가 되게 된다.

메모리가 쓸때없이 낭비되다 보니 그런 결과가 나타난거 같았다.


💡다른 풀이방법에 대한 제안

제한시간이 빡빡하게 걸려있는 문제를 보면 시간복잡도가 O(N^2)이 넘어가면 안될 것 같다는 편견이 있었다.

실제로 알고리즘을 작성하며 2중 for문을 사용하여 순회하였기 때문에 시간초과에 걸릴 수 있다고 생각했다.

비록 느리지만 문제 조건에 부합하는 속도가 나왔기에 정답처리 되었다.

다르게 문제에 접근할 수 있는 방법을 고민했지만 찾아낼 수 없었고 ChatGPT를 사용하여 다른 접근법을 물어보았다.

수열을 정렬한 후 while() 루프 속에서 포인터를 움직이며 조건을 검사하고 특정 쌍을 찾는 방법이 있었다!!

해당 방법을 사용하면 O(N^2)에서 O(NlogN)으로 시간을 감소시킬 수 있는 방법이였다.

알고리즘 문제에서 반복문을 최소한으로 사용하는게 중요한 것 같다!

0개의 댓글