https://school.programmers.co.kr/learn/courses/30/lessons/118667
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
이 문제 풀 때 애 먹었던 것
- 시간초과
- 최대 몇번 걸리는 것인지
이 2가지입니다. 처음에는 무한 루프로 돌면서 두 큐가 같은 값이 될 때까지 돌리니, 시간초과 에러가 났습니다.
왜 시간초과가 날까... 무한루프 때문이겠거니... 그래서 최대로 계산을 몇번 할까를 생각했습니다.
제한사항을 보면, queue1과 queue2의 길이는 같고 최대 길이는 300,000 입니다.
그렇다면 queue1 길이 * 2 만큼 최대 계산을 할줄 알았는데, 아니였습니다. 그래도 계속 시간초과 에러가 있더군요..
혹시... Queue가 아닌 List를 썼기 때문일까... 해서 list를 queue로 바꿨더니 시간초과 에러는 더 이상 발생하지 않았습니다.
하지만 계속 1번을 틀리더군요.. 질문하기를 보니 최대 연산 값을 queue 길이 * 4로 잡아야한다더군요...? (이것에 대한 의견도 다양하고, 증명은 되지 않았습니다.)
어쨋든.. 연산 최대값을 늘려야하는구나.. 근데 4배인건 너무 긴거 아닌가... 조금만 늘리면 될 거 같은데... 하는 생각으로 1씩 증가시켜 봤습니다.
그러니 딱 +3 하면 통과되더군요. 아직도 왜 이게 최대 값인지는 증명하지 못 하겠습니다.
import java.util.*;
class Solution {
public int solution(int[] queue1, int[] queue2) {
int answer = 0;
long q1 = 0, q2 = 0, sum = 0;
Queue<Integer> qu1 = new LinkedList<>(), qu2 = new LinkedList<>();
for (int i = 0; i < queue1.length; i++) {
qu1.add(queue1[i]); qu2.add(queue2[i]);
q1 += queue1[i]; q2 += queue2[i];
}
sum = q1 + q2;
if (sum % 2 != 0) return -1;
sum /= 2;
for (int i = 0; i <= queue1.length*2+2; i++) {
if (q1 == sum) return answer;
if (q1 > q2) {
q1 -= qu1.peek();
q2 += qu1.peek();
qu2.add(qu1.poll());
} else {
q1 += qu2.peek();
q2 -= qu2.peek();
qu1.add(qu2.poll());
}
answer++;
}
return -1;
}
}
왜 list보다 queue가 빠를까 싶으시다면..!
https://gist.github.com/FedericoPonzi/8d5094dbae33cbb94536a73f62d1c1a0
Big O notation for java's collections
Big O notation for java's collections. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
참고하시길 바랍니다..
안녕히계세요뿅
'PS' 카테고리의 다른 글
[프로그래머스] 무인도여행 자바 풀이 (0) | 2023.04.17 |
---|---|
[프로그래머스] 달리기 경주 자바 풀이 (1) | 2023.04.15 |
[프로그래머스] 베스트앨범 자바 풀이 (0) | 2023.04.06 |
[프로그래머스] 방문 길이 자바 풀이 (0) | 2023.04.02 |
[프로그래머스] 오픈채팅방 자바 풀이 (0) | 2023.03.25 |