Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- NRVO
- directx
- C++
- 언리얼엔진5
- UnrealEngine4
- Programmers
- 프로그래머스
- 2294
- DirectX11
- const
- 팰린드롬 만들기
- RVO
- Frustum
- UE5
- GeeksForGeeks
- UnrealEngine5
- 오블완
- DeferredRendering
- 티스토리챌린지
- softeer
- 백준
- baekjoon
- algorithm
- 줄 세우기
- RootMotion
- IFileDialog
- C
- Unreal Engine5
- 1563
- winapi
Archives
- Today
- Total
Game Develop
[Algorithm] Programmers :: 두 큐 합 같게 만들기 본문
https://school.programmers.co.kr/learn/courses/30/lessons/118667
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
|
int solution(vector<int> queue1, vector<int> queue2) {
int answer = 0;
long long target = 0;
long long queueSum1 = 0;
long long queueSum2 = 0;
queue<long long> q1;
queue<long long> q2;
int maxCount = queue1.size() * 2 + 1;
for (int i = 0; i < queue1.size(); ++i)
{
queueSum1 += queue1[i];
queueSum2 += queue2[i];
q1.push(queue1[i]);
q2.push(queue2[i]);
}
target = (queueSum1 + queueSum2) / 2;
while (1)
{
if (queueSum1 == queueSum2 && queueSum2 == target)
{
break;
}
else if (answer > maxCount)
{
return -1;
}
if (queueSum1 < queueSum2)
{
int temp = q2.front();
q2.pop();
q1.push(temp);
queueSum1 += temp;
queueSum2 -= temp;
}
else
{
int temp = q1.front();
q1.pop();
q2.push(temp);
queueSum1 -= temp;
queueSum2 += temp;
}
++answer;
}
return answer;
}
|
cs |
처음 주어지는 두 큐의 합의 평균을 target으로 잡은 후, 두 큐의 원소의 합이 각각 target이 될 때까지 pop하고 insert를 한다. 이 때 최소의 횟수를 구하는 문제다.
문제에선 큐 어쩌고 저쩌고 했지만 사실 보자마자 투포인터형식인걸 감으로 알긴 했다.
근데 일단 당장은 큐로 옮긴다음 푸는게 바로 풀릴것 같아서 큐로 옮긴다음 풀었다.
현재 큐1의 합이 큐2보다 작을 경우, 큐2의 원소를 pop해서 큐1에 push하는 식으로 밸런스를 맞추면서 카운팅하고, 조건이 되면 카운팅한 값을 리턴 시키게했다.
최대카운팅제한조건을 단순히 큐사이트 * 2로 했다가 테스트케이스 2개가 통과 안되길래 다른사람 풀이를 보니 *4로 했더니 통과했다. 그런데 혹시나해서 * 4대신 * 2 +1로 바꿨더니 잘 통과한다.
다만 투포인터로 접근하는게 출제자의 의도가 아닌가..하는 생각이 들어서 투포인터로도 풀어봤다.
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
73
74
75
76
77
78
79
|
#include <numeric>
using namespace std;
int solution(vector<int> queue1, vector<int> queue2) {
int answer = 0;
long long target = 0;
long long queueSum1 = accumulate(queue1.begin(), queue1.end(), 0ll);
long long queueSum2 = accumulate(queue2.begin(), queue2.end(), 0ll);
vector<int> q = queue1;
for (int i = 0; i < queue2.size(); ++i)
{
q.push_back(queue2[i]);
}
int maxCount = q.size() + 1;
int queueSize = q.size();
target = (queueSum1 + queueSum2) / 2;
int q1p_s = 0;
int q1p_e = queue1.size() - 1;
int q2p_s = queue1.size();
int q2p_e = queue1.size() * 2 - 1;
while (1)
{
if (queueSum1 == queueSum2 && queueSum2 == target)
{
break;
}
else if (answer > maxCount)
{
return -1;
}
if (queueSum1 < queueSum2)
{
queueSum1 += q[q2p_s];
queueSum2 -= q[q2p_s];
++q2p_s;
if (q2p_s == queueSize)
{
q2p_s = 0;
}
++q1p_e;
if (q1p_e == queueSize)
{
q1p_e = 0;
}
}
else
{
queueSum1 -= q[q1p_s];
queueSum2 += q[q1p_s];
++q2p_e;
if (q2p_e == queueSize)
{
q2p_e = 0;
}
++q1p_s;
if (q1p_s == queueSize)
{
q1p_s = 0;
}
}
++answer;
}
return answer;
}
|
cs |
'Algorithm > Programmers' 카테고리의 다른 글
[Algorithm] Programmers :: 보행자 천국 (0) | 2023.03.21 |
---|---|
[Algorithm] Programmers :: 인사고과 (0) | 2023.02.07 |
[Algorithm] Programmers :: 무인도 여행 (0) | 2023.02.02 |
[Algorithm] Programmers :: 순위 (0) | 2023.01.17 |
[Algorithm] Programmers :: 등산코스 정하기 (0) | 2023.01.16 |