본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 27487번 One and Two

by 현장 2026. 1. 1.

-Code

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

public class BOJ27487 {
    public static void main(String[] args) throws IOException {
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));

        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            int n = Integer.parseInt(br.readLine());
            // nums 초기화
            int[] nums = new int[n];
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < n; j++) {
                nums[j] = Integer.parseInt(st.nextToken());
            }
            // 계산 로직
            int answer = solution(nums, n);
            System.out.println(answer);
        }
    }
    // 1은 곱해도 자기 자신이므로 2만 세서 계산
    private static int solution(int[] nums, int size) {
        // 2 갯수 새기
        int totalTwoCnt = 0;
        for (int num : nums) {
            if (num == 2) totalTwoCnt++;
        }
        // 2의 갯수가 홀수면 반으로 나눌 수 없어서 -1
        if (totalTwoCnt % 2 == 1) return -1;
        // 2의 갯수가 0이면 처음부터 가능하므로 1 반환
        if (totalTwoCnt == 0) return 1;
        // 둘다 아닌 경우 2의 총 갯수의 반절되는 구간을 반환하면 됨
        int twoCnt = 0;
        for (int i = 0; i < size; i++) {
            if (nums[i] == 2) {
                twoCnt++;
                if (twoCnt == totalTwoCnt / 2) {
                    return i + 1;
                }
            }
        }
        return -1;
    }
}

처음에는 1, 2가 아니라 범위가 더 넓은 값인 줄 알고 누적곱을 활용해 풀었습니다. 하지만 입력이 1, 2만 주어지고 배열의 크기가 1000까지 기 때문에 값이 끝까지 가면 2^1000까지 가서 범위를 벗어나게 되어 틀렸습니다. 1, 2가 주어진 것과 2의 개수를 계산해서 풀어라 라는 힌트를 받고 총개수를 2로 나눈 값과 같으면 왼쪽과 오른쪽의 각 누적 곱이 같아지기 때문에 그 로직을 사용해 해결했습니다.