백준 3273 - 두 수의 합

Updated:

Java

3273 번 - 두 수의 합

문제

접근 방법

2가지 방법으로 해결하였다.

첫 번째 방법

정렬 후에 각 수의 존재 여부를 나타내는 boolean 배열을 통해 쌍을 구한다.

두 번째 방법

정석 투포인터로 해결

코드 - boolean[]

import java.util.*;
import java.io.*;

public class Main {
	static int n, x, result, MAX_SIZE = 2000001;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	n = stoi(br.readLine());
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	x = stoi(br.readLine());
    	
    	int[] arr = new int[n];
    	boolean[] isIn = new boolean[MAX_SIZE];
    	for(int i = 0; i < n; i++) {
    		arr[i] = stoi(stk.nextToken());
    		isIn[arr[i]] = true;	// 값이 있는지 확인
    	}
    	
    	Arrays.sort(arr);
    	
    	int idx;
    	for(int i = 0; i < n; i++) {
    		if(arr[i] > x / 2)	// 찾으려는 x의 절반 크기보다 더 큰 경우 쌍을 찾을 수 없다. 
    			break;
    		
    		idx = x - arr[i];
    		if(isIn[idx] && x / 2 != idx)	// 반대편 쌍과, 그 쌍이 현재 값과 다를 시
    			result++;
    	}
    	
    	System.out.println(result);
    	br.close();
	}
	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

코드 - 투 포인터

import java.util.*;
import java.io.*;

public class Main {
	static int n, x, result, MAX_SIZE = 2000001;
	public static void main(String[] args) throws IOException {
		System.setIn(new FileInputStream("res/mainInput.txt"));	//제출 할 때 주석해야함
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	n = stoi(br.readLine());
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	x = stoi(br.readLine());
    	
    	int[] arr = new int[n];
    	for(int i = 0; i < n; i++) {
    		arr[i] = stoi(stk.nextToken());
    	}
    	
    	Arrays.sort(arr);
    	
    	int s = 0,e = n - 1, sum;
    	while(s < e) {
    		sum = arr[s] + arr[e];
    		if(sum == x) {	// x와 같으면 답++
    			result++;
    			s++;
    			e--;
    		}
    		else if(sum < x) {	// x가 더 크면, 왼쪽 인덱스 증가
    			s++;
    		}
    		else {	// x가 더 작으면, 오른쪽 인덱스 증가
    			e--;
    		}
    	}
    		
    	System.out.println(result);
    	br.close();
	}
	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

개선할 점