https://school.programmers.co.kr/learn/courses/30/lessons/118667
<풀이>
1. 두 개의 큐를 입력받는다.
2. 두 개의 큐의 원소의 합이 같아질 때까지 원소를 이동한다.
3. 원소이동작업의 최소회수를 반환한다.
<해법>
1. 원소이동을 최소로 하는 방법
=> 작업회수를 최소로 하는 방법부터 생각해야합니다. 최소로 하는 방법은 작업때 마다 원소의 합이 큰 큐에서 원소를 빼서 작은 쪽으로 넣는 방법입니다. 이유는 큰 쪽에서 작은 쪽으로 넘겨야 작업 회수가 최소가 되기 때문입니다. 물론, 작은 쪽에서 먼저 빼고, 큰 쪽에서 빼는 경우가 최소회수가 될 수도 있습니다. 하지만, 이 경우는 큰 쪽에서 먼저 빼는 경우와 회수가 같은 경우일 뿐입니다. 이 부분은 직접 그림을 그려가며 해보시면 충분히 이해하실 수 있습니다.
2. 원소이동 방법
=> 주어진 벡터에서 포인터를 이용해서 원소이동을 구현합니다. 아래 그림과 코드를 참고해서 봐주시면 이해하실 수 있습니다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(vector<int> queue1, vector<int> queue2) {
//선언
int answer; //-> 정답
vector<int>::iterator ptr1, ptr2; //-> 큐 포인터
long long sum_all, sum1, sum2; //-> 큐1+큐2합, 큐1합, 큐2합
//초기화
answer = 0;
ptr1 = queue1.begin(), ptr2 = queue2.begin();
sum_all = 0, sum1 = 0, sum2 = 0;
/* 해법 */
//1. 큐1, 큐2, 큐1+큐2 원소 합 구하기
for (int i = 0; i < queue1.size(); i++) {
sum1 += queue1[i];
sum2 += queue2[i];
}
sum_all = sum1 + sum2;
//2. 큐1+큐2 원소 합이 홀수일 경우 -> 불가능
if (sum_all % 2 != 0) {
answer = -1;
}
else {
//3. 큐1, 큐2에 있는 두 개의 포인터를 조종하며 원소 합 구하기
while (true) {
//종료조건1 -> 두 큐의 합이 같을 경우
if (sum1 == sum2) {
break;
}
//종료조건2 -> 포인터1이 큐2 끝까지 갔을 경우 or 포인터2가 큐1 끝까지 갔을 경우(탐색완료)
if (ptr1 == queue2.end() || ptr1 == queue1.end()) {
answer = -1;
break;
}
//큐의 포인터 옮기기
if (sum1 > sum2) {
sum1 -= *ptr1;
sum2 += *ptr1;
ptr1++;
if (ptr1 == queue1.end()) {
ptr1 = queue2.begin();
}
}
else {
sum2 -= *ptr2;
sum1 += *ptr2;
ptr2++;
if (ptr2 == queue2.end()) {
ptr2 = queue1.begin();
}
}
answer++;
}
}
//반환
return answer;
}
|
구현에 대해 알아볼 수 있는 문제였습니다.
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[C++] 프로그래머스 - 개인정보 수집 유효기간 (0) | 2023.02.01 |
---|---|
[C++] 프로그래머스 - 코딩 테스트 공부 (0) | 2022.08.24 |
[C++] 프로그래머스 - 성격 유형 검사하기 (0) | 2022.08.24 |
[C++] 프로그래머스 - 호텔 방 배정 (0) | 2021.05.05 |
[C++] 프로그래머스 - 징검다리 건너기 (0) | 2021.05.04 |