알고리즘/프로그래머스

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

K.두부 2022. 8. 22. 23:54
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/118667?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

문제 설명에 나와있는 내용대로 큐를 이용해서 풀면 된다. 

문제를 보자마자 높은 값에서 낮은 값으로 인자를 이동시키면 풀면 된다는 걸 알았다.

하지만 큐의 선언과 사용 방법을 알지 못해서 구글링을 했다.

 

이 문제에서 주의해야 할 건 합계(sum)가 int 형이면 오버플로우가 발생할 수 있기 때문에 long 형으로 선언해야 한다는 거다. 사실 문제를 잘 읽고 풀었다면 별 문제없을 거라고 생각한다.

import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int solution(int[] queue1, int[] queue2) {
int answer = 0;
long sum1 = 0; // queue1 을 모두 더한 값
long sum2 = 0; // queue2 를 모두 더한 값
Queue<Integer> que1 = new LinkedList<>();
Queue<Integer> que2 = new LinkedList<>();
// que1 과 sum1 에 값을 넣어줌
for (int i=0; i<queue1.length; i++) {
sum1 += queue1[i];
que1.add(queue1[i]);
}
// que2 과 sum2 에 값을 넣어줌
for (int i=0; i<queue2.length; i++) {
sum2 += queue2[i];
que2.add(queue2[i]);
}
int tmp = 0; // 큰 값의 큐의 첫 번째 인자를 넣기 위한 변수
while (sum1 != sum2) {
answer++;
if (sum1 > sum2) {
tmp = que1.poll();
sum2 += tmp;
sum1 -= tmp;
que2.add(tmp);
} else {
tmp = que2.poll();
sum1 += tmp;
sum2 -= tmp;
que1.add(tmp);
}
// 인자 값을 다 이동했음에도 sum1 과 sum2 의 값이 다를 경우
if (answer > (queue1.length + queue2.length * 2)) return -1;
}
return answer;
}
}

 

 

반응형