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;
}