[투포인터] 20366번 - 같이 눈사람 만들래?

안수진·2024년 8월 6일

Baekjoon

목록 보기
30/55
post-thumbnail

[백준] 20366번 - 같이 눈사람 만들래?

📝 나의 풀이

⭕ 접근 방법 - 투포인터

  1. 눈덩이 크기 정렬
  2. 엘사가 만든 몸통, 머리 눈덩이 선택
  3. 엘사가 선택하지 않은 눈덩이들을 이용해서 엘사 눈사람의 키와 가장 가까운 값을 가지는 두 눈덩이 선택

이 로직이 딱 떠올랐는데 투포인터에 익숙하지 않아서
어떻게 구현할지에 대해 고민하는 시간을 많이 가졌다.

💻 제출 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	static int N;
	static int[] snow;
	static int diff = Integer.MAX_VALUE;
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine()); // 배열 A의 크기
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		snow = new int[N];
		for(int i = 0; i < N; i++) {
			snow[i] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(snow);
		
		for(int i = 0; i < N; i++) {
			for(int j = i + 1; j < N; j++) {
				
				int snowMan1 = snow[i] + snow[j]; // 엘사가 먼저 눈사람 고르기
				int start = 0, end = N-1;
				
				while(start < end) {
					if(start == i || start == j) {
						start++;
						continue;
					}
					
					if(end == i || end == j) {
						end--;
						continue;
					}
					
					int snowMan2 = snow[start] + snow[end];
					diff = Math.min(Math.abs(snowMan1 - snowMan2), diff);
					
					if(snowMan1 > snowMan2) {
						start++;
					}
					else if(snowMan1 < snowMan2){
						end--;
					}
					else {
						System.out.println(0);
						return;
					}
				}
			}
		}
		
		System.out.println(diff);
	}

}
profile
항상 궁금해하기

0개의 댓글