TIL 23.4.16// 주로 코딩테스트용 c++과 관련된 기초적인 사항들을 공부한 하루.

++++++++++++++++++++++++++++++

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

++++++++++++++++++++++++++++++++++

#include <bits/stdc++.h>
using namespace std;

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++) v.push_back(i);

	auto it = find(v.begin(), v.end(), 3) - v.begin();
	cout << it << " <<<====<< iterator를 출력했을때의 결과물";
		
}

위 코드에서 

 auto it=find(v.begin(),v.end(),3)-v.begin();

에서, 만약 -v.begin()부분이 없을때 어떤식으로 출력되나 궁금해서 해보려 하니까, 출력이 안되었다. 

 

이러한 에러코드와 함께. 

그리고 그럴 경우 auto it는

 

이렇게 표시되고.

 

만약 -begin을 해주면

 

auto it의 경우

이렇게 바뀌고, 

cout<<it;도 문제없이 연산된다. 

 

그와 관련하여서 궁금한 부분에 대해서 gpt에 검색해봤을때 나온 내용을 첨부해보면, 

이와 같다. 

여기서 얘기하는 distanc 함수에 대하여 추가적으로 질문하여서 얻은 내용은 아래와 같다.

 

일단은 int idx=find(DQ.begin(),DQ.end(),t)-DQ.begin(); 형태로 표현하는 것에 대해서 더욱 익숙해지게 노력하도록 하자. 

 

++++++++++++++++++++++++++++++++++++++

 

====

<<c++ size() 함수가 반환하는 값은 unsigned int임에 주의해야한다. >>

====

boj 1021번 문제의 풀이중에 아래와 같은 주석 내용을 보았다.

이와 관련하여서 검색을 해보니, 

이와 같았다. 

size()가 반환하는 값이 unsinged int 라는걸 신경써야 할것이고, 

그래서 size()로 받아온 값에 대해서는 안전하게 (int)DQ.size()로 항상 형변환 하는것도 괜찮다는

저 표현이 어떤 의미인지 이해된다. 

 

 

  Comments,     Trackbacks