[JAVA] 두 큐 합 같게 만들기 - 프로그래머스 LV2

나길진·2023년 12월 17일

프로그래머스

목록 보기
2/9

해당 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/118667

해결 방법

  1. 두 큐의 합을 구한다.
  2. 두 큐의 합이 같은지 확인한다.
  3. 두 큐중 합이 큰 큐의 요소를 빼서 작은 큐에 넣어준다.
  4. 1~3 반복

문제점

루프에 탈출 지점은 언제로 해야할 지 고민이였다.
처음엔 두 큐중 하나라도 비어있는 상태가 되어있으면 되지 않을까 고민했지만 시간초과가 발생했다.

그 다음에 생각한 방법이 두 큐의 요소 갯수 합보다 동작횟수가 커지면 루프탈출 조건을 설정해봤더니 테스트1번에서 실패했다.

어떤 예외케이스가 있을까 라고 생각하다가
[1,1,6,8,7]
[1,1,1,1,1] 케이스에서 횟수 + 1까지 고려해야한다는 사실을 알았다.

소스코드

public int solution(int[] queue1, int[] queue2) {
    Queue<Long> q1 = arrayToQueue(queue1);
    Queue<Long> q2 = arrayToQueue(queue2);

    long sum1 = getQueueSum(q1);
    long sum2 = getQueueSum(q2);

    int answer = 0;
    int maxCount = (q1.size() + q2.size()) + 1;
    while (sum1 != sum2) {
        if (answer > maxCount) {
            return -1;
        }
        if (sum1 < sum2) {
            long element = q2.poll();
            q1.add(element);
            sum1 += element;
            sum2 -= element;
        } else {
            long element = q1.poll();
            q2.add(element);
            sum2 += element;
			sum1 -= element;
		}
		answer++;
	}

	return answer;
}

생각할 점

루프의 탈출 조건이 중요한 문제같은데 다른사람의 풀이를 보니 두 큐의 요소의 갯수 합 * 2로 푸는 경우가 많았다. 이유는 최악의 경우의 수를 했을 때 라고 하는데 내 머리로는 그 만큼 도는 경우를 모르겠다... 고민해 봐야겠다

profile
백엔드 개발자

0개의 댓글