#include <bits/stdc++.h>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
queue<int> Q;
for (int i = 1; i <= n; i++)
Q.push(i);
while (Q.size() != 1)
{
Q.pop();
Q.push(Q.front());
Q.pop();
}
cout << Q.front();
}
boj 2164 문제의 위와 같은 코드에서, while(Q.size()!=1)이 while 문 내부의 연산들을 실행하는 중간에 Q.size()==1이 되었을때 어떤식으로 진행되는지 헷갈려서 알아보았다.
gpt를 통해서는
위와같은 정보를 얻을 수 있었고,
실제적으로 한번 코드를 실행해서 while문 내부에서 종료조건에 해당했을때 더 남아있는 연산이 실행이 되는지 안되는지 알아보기 위해서,
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
queue<int> Q;
for (int i = 1; i <= n; i++)
Q.push(i);
while (Q.size() != 1) {
Q.pop();
Q.push(Q.front());
if (Q.size() == 2) {
cout << Q.front() << "=>2장일때 제일 윗장 \n";
Q.pop();
cout << Q.front() << "=>2장일때 제일 아랫장\n";
//Q.pop();
}
//Q.front();
}
//cout << Q.front();
}
이와같은 코드를 작성해서 여러가지 경우들로 넣었다 뺐다 해보며 실행해보았는데,
while문 내부에서 Q.size()==1이 되더라도, 이미 실행되고 있는 while문 내부의 연산은 지속적으로 실행이 되고 while문이 종료되었다.
그래서 처음에는
이 문제에서, 예를들어 카드가 24 같이 남은 경우는 문제에서는 2를 버리고 4를 출력하라 했는데,
while문 연산을 다 해버리면 2를 버리는것 이후의 연산도 하는데 어떻게 답이 나오는걸까 고민을 많이 해봤는데,
연산과정을 생각해보면,
2를 버리고 4를 남기고, 4를 다시 큐에 새롭게 추가하면 4, 4 인 큐가 되고, 그리고 그 위에있는 4를 pop해서 맨 마지막에 4를 남기는 연산을 통해서 결국 원하는 답이 나올 수 있다는걸 알게되었다.
결론적으로 문제에서 말하는 과정보다 추가적인 연산이 있지만, 이 경우도 카드가 2장만 남은 경우에 확실하게 한장의 카드를 버리고 남은 한장만 출력하는 결과물과 동일한 결과물을 지속적으로 낼 수 있는 프로그램이기 때문에
이 while문을 통한 연산은 문제가 없다는 것이다.
while문과 관련된 연산, 그리고 queue와 관련된 연산에서 위와 같은 과정상 맨 마지막 원소들에 대해서 주의를 기울이면서 문제를 풀어보도록 하자.
'알고리즘 > BOJ' 카테고리의 다른 글
c++ size() 함수가 반환하는 값은 unsigned int임에 주의해야한다. (0) | 2023.04.16 |
---|---|
cout을 통한 iterator의 출력의 경우에 관하여. (0) | 2023.04.16 |
문제를 풀다가 만난 1LL에 대하여. (0) | 2023.04.15 |
c++ 이분탐색 문제를 할때는 sort()로 미리 정렬을 시켜놓고 문제를 풀어야 한다는걸 기억하자. (0) | 2023.04.13 |
c++ binary_search()가 이미 stl로 있다는걸 기억하고, 이분탐색 문제의 경우 이 stl을 활용하도록 하자. (0) | 2023.04.13 |