λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Problem Solving

[Java] λ°±μ€€ 31091 - 거짓말

https://www.acmicpc.net/problem/31091

 

풀이

 

예λ₯Όλ“€μ–΄, N = 5λͺ…이고, 각자 λ‹€μŒκ³Ό 같이 μ£Όμž₯ν•˜κ³  μžˆλ‹€

[ 1, 4, 3, 5, 2 ]

 

이 μƒν™©μ—μ„œ κ±°μ§“λ§ν•œ μ‚¬λžŒμ˜ μˆ˜κ°€ 3λͺ…이 κ°€λŠ₯ν•œμ§€ ν™•μΈν•˜κ³  μ‹Άλ‹€λ©΄

1. 배열을 μ •λ ¬ν•œλ‹€ : [ 1, 4, 3, 5, 2 ] ==> [ 1, 2, 3, 4, 5 ]

2. (μ‚¬λžŒμ˜ 수  −  3보닀 졜초둜 큰 κ°’μ˜ 인덱슀) = 5 - 3 = 2

3. 2 != 3

∴ κ±°μ§“λ§ν•œ μ‚¬λžŒμ΄ 3λͺ…이 될 수 μ—†λ‹€.

 

이런 μ‹μœΌλ‘œ κ°€λŠ₯ν•œ κ±°μ§“λ§μŸμ΄μ˜ 수λ₯Ό 0λΆ€ν„° NκΉŒμ§€ 돌렀보고, 이뢄탐색(upper bound)둜 μ‹€μ œ κ±°μ§“λ§ν•œ 인원을 ν™•μΈν•˜κ³  비ꡐ해주면 λœλ‹€. λ‹€λ§Œ μŒμˆ˜μ™€ μ–‘μˆ˜λŠ” λ”°λ‘œ λ‹€λ₯Έ 배열에 μ €μž₯ν•΄μ„œ λŒλ €μ•Όν•˜κ³ , 음수 λ°°μ—΄μ—μ„œ 이뢄탐색 돌릴 λ•Œ λͺ©ν‘œκ°’을 음수둜 λ°”κΏ”μ£ΌλŠ” κ²ƒλ§Œ 쑰심해주면 λœλ‹€.

 

 

 

μ½”λ“œ
더보기
import java.io.*;
import java.util.*;

public class Main {
	public static int upperBoundBinarySearch(ArrayList<Integer> list, int target) {
		int left = 0;
		int right = list.size();

		while (left < right) {
			int mid = (left + right) / 2;
			if (target < list.get(mid)) {
				right = mid;
			} else {
				left = mid + 1;
			}
		}

		return left;
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine());
		ArrayList<Integer> pos = new ArrayList<>();
		ArrayList<Integer> neg = new ArrayList<>();

		for (int i = 0; i < N; i++) {
			int temp = Integer.parseInt(st.nextToken());
			if (temp > 0) {
				pos.add(temp);
			} else {
				neg.add(temp);
			}
		}

		Collections.sort(pos);
		Collections.sort(neg);

		int answer = 0;
		StringBuilder sb = new StringBuilder();

		for (int lier = 0; lier <= N; lier++) {
			int actualLier = 0;
			actualLier += (neg.size() - upperBoundBinarySearch(neg, -1 * lier));
			actualLier += (pos.size() - upperBoundBinarySearch(pos, lier));

			if (lier == actualLier) {
				answer++;
				sb.append(lier).append(' ');
			}
		}

		System.out.println(answer);
		System.out.println(sb);
		br.close();
	}
}

 

ν›„κΈ°

 

개인적으둜 κ³¨λ“œ5λ³΄λ‹€λŠ” μ–΄λ ΅λ‹€κ³  λŠλ‚€ 문제. μ—¬λŸ¬κ°€μ§€ 풀이가 κ°€λŠ₯ν•œ 것 κ°™λ‹€. λ‹€λ“€ μœ„μ™€ λΉ„μŠ·ν•œ κ°œλ…μœΌλ‘œ λˆ„μ ν•©μ„ μ‚¬μš©ν•œ 것 κ°™κ³ , 투 포인터도 κ°€λŠ₯ν•˜λ‹€κ³  ν•œλ‹€.