Algorithm/연결리스트

백준 1158 cpp // 연결리스트 풀이, int_to_string(int), List.erase() 주의사항

Mini_96 2023. 8. 16. 11:01

https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

 

*의사코드

1.   [1, 2, 3,4,5,6,7] List에 push

2. 2회(k-1)회 만큼 커서++

3. 단, end이면 시작점으로 돌리기

 

*문제 : 밑에줄에 now=L.erase()가 문제였다. 

erase는 다음원소 idx를 반환 -> 끝숫자가 지워지면 now가 end포인터가됨

/*
* 문제 : <1 6 7> 에서
* 7이 지워지면
* now가 end가 됨.
* 해결 : end이면 시작점으로 바꿔주기
*/

if (now == L.end()) {
    now = L.begin();
}

 

* 문제 2 : 문자열문제

str += 1(숫자) 하면 오류가난다.

해결 : str+to_string(1)

string temp = to_string(*now);
ret+= temp;

 

* 전체코드

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

int n,k;
list<int> L;
string ret="<";
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> n >> k;
	for (int i = 1; i <= n; ++i) {
		L.push_back(i);
	}
	
	auto now = L.begin();
	while (L.size()) {
		for (int i = 0; i < k - 1; ++i) {
			now++;
			if (now == L.end()) {
				now = L.begin();
			}
		}
		//cout << *now << "\n";
		string temp = to_string(*now);
		ret+= temp;
		ret += ", ";
		now=L.erase(now);

		/*
		* 문제 : <1 6 7> 에서
		* 7이 지워지면
		* now가 end가 됨.
		* 해결 : end이면 시작점으로 바꿔주기
		*/
		if (now == L.end()) {
			now = L.begin();
		}
		//cout << ret<<"\n";
	}

	ret.erase(ret.size() - 1);
	ret.erase(ret.size() - 1);
	ret += ">";
	cout << ret;
	
}