c++ while문에서 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());
        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와 관련된 연산에서 위와 같은 과정상 맨 마지막 원소들에 대해서 주의를 기울이면서 문제를 풀어보도록 하자. 

 

  Comments,     Trackbacks