일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 인플레이션에서 살아남기
- 리액트
- Java
- SoftwareExpertAcademy
- SWEA
- Algorithm
- 노마드코더
- 알고리즘
- Array
- Stack
- 달빛클럽 1기
- 달빛캠퍼스
- 완전탐색
- BOJ
- ReactJS로 영화 웹 서비스 만들기
- 달빛클럽
- 경제공부
- 프로그래머스
- React
- JPA
- 카카오블라인드코딩테스트
- React.js
- HashMap
- 백준
- 자바
- 달빛클럽1기
- dfs
- programmers
- 노마드코더 강의
- 재귀
- Today
- Total
th42500의 TIL
[Java] 2022 KAKAO TECH INTERNSHIP - 두 큐 합 같게 만들기 본문
https://school.programmers.co.kr/learn/courses/30/lessons/118667
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✔ 입출력 예시
💡 포인트
1️⃣ 언어에 따라 합 계산 과정 중 오버플로우 발생 가능성이 있으므로 long type 고려 필요
2️⃣ queue1에서 뺀 원소는 무조건 queue2에 삽입해야하며, queue2에서 뺀 원소는 무조건 queue1에 삽입해야 함
(제시된 원소 중 합의 결과에 포함되지 않는 원소는 ❌)
3️⃣ 각 큐의 길이는 같지 않을 수 있음
❓ 풀이방법
1️⃣ queue1과 queue2의 원소를 담을 큐 2개 선언
2️⃣ 각 큐에 queue1과 queue2의 원소를 담으며 두 큐에 담긴 모든 원소들의 합과 각 큐 원소들의 합 구하기
3️⃣ 각 큐 원소들의 합을 비교하여
queue1에 담긴 원소의 합이 크다면 queue1에서 원소를 1개 빼고 이를 queue2에 담고 각 큐의 합에서도 이를 계산,
queue2에 담긴 원소의 합이 크다면 queue2에서 원소를 1개 빼고 이를 queue1에 담고 각 큐의 합에서도 이를 계산
4️⃣ 각 큐 원소들의 합 모두가 두 큐에 담긴 모든 원소들의 합의 절반과 같을 때까지 3️⃣ 반복
또는 각 원소들이 원래 자리를 찾기 전까지 반복
❗ 결과
👉 테스트 통과
✔ 소스코드
import java.util.LinkedList;
import java.util.Queue;
public class Solution { // 두 큐 합 같게 먼둘기
public static void main(String[] args) {
// int[] queue1 = {3, 2, 7, 2};
// int[] queue2 = {4, 6, 5, 1};
// int[] queue1 = {1, 2, 1, 2};
// int[] queue2 = {1, 10, 1, 2};
int[] queue1 = {1, 1};
int[] queue2 = {1, 5};
// int[] queue1 = {1, 1, 1, 1, 1};
// int[] queue2 = {1, 1, 1, 9, 1};
// result : 12
System.out.println(solution(queue1, queue2));
}
private static int solution(int[] queue1, int[] queue2) {
int result = 0;
Queue<Integer> q1 = new LinkedList<>();
Queue<Integer> q2 = new LinkedList<>();
long sum = 0; // 모든 큐의 합을 담을 변수
long sum1 = 0; // q1의 합을 담을 변수
long sum2 = 0; // q2의 합을 담을 변수
for (int i = 0; i < queue2.length; i++) {
q1.add(queue1[i]);
sum += queue1[i];
sum1 += queue1[i];
q2.add(queue2[i]);
sum += queue2[i];
sum2 += queue2[i];
}
long half = sum/2; // 각 큐의 수의 합이 절반일 때의 수
boolean same = true; // 정해진 횟수 안에 각 큐의 합이 같을지 판별할 변수
while(sum1 != half || sum2 != half) {
if(result > queue1.length*3) {
same = false;
break;
}
if(!q1.isEmpty() && sum1 > sum2) { // sum1이 sum2보다 크다면
int num = q1.poll();
q2.add(num);
sum1 -= num;
sum2 += num;
} else if(!q2.isEmpty() && sum1 < sum2){ // sum2가 sum1보다 크다면
int num = q2.poll();
q1.add(num);
sum2 -= num;
sum1 += num;
}
result++;
}
if(!same) { // 제한 횟수 안에 두 큐의 합이 같지 않다면 result = -1
result = -1;
}
return result;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Java] 깊이/너비 우선 탐색(DFS/BFS) - 여행경로 (Lv3) (0) | 2022.10.09 |
---|---|
[Java] 완전탐색 - 카펫 (Lv2) (0) | 2022.09.19 |
[Java] 2022 KAKAO TECH INTERNSHIP - 성격 유형 검사하기 (0) | 2022.08.29 |
[Java] 완전탐색 - 최소 직사각형 (Lv1) (0) | 2022.08.07 |
[Java] 2018 KAKAO BLIND RECRUITMENT - [1차] 뉴스 클러스터링 (Lv2) (0) | 2022.08.05 |