출처: https://bumcrush.tistory.com/182 [맑음때때로 겨울]
반응형

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

 

프로그래머스

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

programmers.co.kr

 

package Programmers;
import java.util.LinkedList;
import java.util.Queue;
public class 두큐합같게만들기 {
public static void main(String[] args){
두큐합같게만들기 T = new 두큐합같게만들기();
int[] queue1 = {1, 1};
int[] queue2 = {1, 5};
T.solution(queue1, queue2);
}
public int solution(int[] queue1, int[] queue2) {
int answer = -1;
long sumQ1 = 0;
long sumQ2 = 0;
long req = 0;
Queue<Integer> q1 = new LinkedList<>();
Queue<Integer> q2 = new LinkedList<>();
//큐에 담는다.
for (int i = 0; i < queue1.length; i++) {
int curQ1 = queue1[i];
int curQ2 = queue2[i];
q1.offer(curQ1);
q2.offer(curQ2);
sumQ1 += curQ1;
sumQ2 += curQ2;
}
req = sumQ1 + sumQ2;
//홀수면 답이 나올수 없으므로 -1을 반환
if(req % 2 != 0){
return -1;
}
req /= 2;//필요한 합
int p1 = 0; // q1이 poll할때마다 늘어날 값
int p2 = 0; // q2가 poll할때마다 늘어날 값
int limit = queue1.length*2;
//최대 돌수있는 값은 q1이던 q2던 최대길이의 *2만큼 이거이상가면 그냥 계속 반복일뿐
while (p1 <= limit && p2 <= limit){
if (sumQ2 == req) {
return p1 + p2;
}
if(sumQ2 > req){
sumQ1 += q2.peek();
sumQ2 -= q2.peek();
q1.offer(q2.poll());
p2++;
}else {
sumQ2 += q1.peek();
sumQ1 -= q1.peek();
q2.offer(q1.poll());
p1++;
}
}
return -1;
}
}

1. 풀이 

  - sumQ1, sumQ2, req 는 반드시 long 타입으로 선언해야한다. (중요) 

    -> 합산 하면서 int 크기를 초과하는 케이스가 발생하는듯 

  - while 문을 돈다. q1,q2 길이 * 2  Poll 이 최대 반복횟수 (핵심)

  - sumQ2 가 필요한 합보다 크면 빼서 q1에 넣고 

    아니다 하면 q1에서 빼서 q2에 집어넣는것을 반복하여 답을 구한다.

 

 

sumQ1, sumQ2, req 는 반드시 long 타입으로 선언해야한다. (중요) 

   얼마만큼 반복을 하냐 이걸 생각해 내는게 가장 중요한 포인트같다.

   처음엔 아무생각없이 지문대로 q2 먼저 쭈욱 뽑고 req 조건에 맞추고 

   다음에 또 q1 먼저 쭈욱 뽑고 req 조건에 맞췄는데 이러면 경우의 수대로 반복문을 계속만들어야함. 

  

  지문에 낚이고, long타입을 int 타입으로 선언해서 많이 해맸다.

 

반응형

+ Recent posts