본문 바로가기
알고리즘

[백준/C++] 1158번 요세푸스 문제 List iterator 사용

by heyh0 2021. 12. 2.

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

 

1158번: 요세푸스 문제

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

www.acmicpc.net

 

// 코드

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

int main(){
    list<int> L;
    int N, K, e;
    cin >> N >> K;
    int num[N];
    
    for(int i = 1; i <= N; i++) L.push_back(i);
    list<int>::iterator t = L.begin();
    
    for(int j = 0; j < N; j++)
    {
        e = L.back(); 
        // list L의 끝수 저장
        for(int k = 0; k < K-1; k++)
        {
            	if(e == *t) t = L.begin(); 
                // *t가 끝수와 같을 경우 t에 첫수 주소
            	else t++; // 아니면 주소 +1
        }
        num[j] = *t; 
        // 삭제하는 순서대로 저장
        if(e == *t)
        {
            L.erase(t);
            t = L.begin(); 
            // 끝수를 지웠을 경우 t의 지점을 첫수 주소로 저장
        }
        else t = L.erase(t);
    }
    // 출력
    cout << "<";
    for(int k = 0; k < N; k++)
    	{
        	cout << num[k];
        	if(k != N-1) cout << ", ";
    	}
    cout << ">";
    return 0;
}

 

'알고리즘' 카테고리의 다른 글

[백준/C++] 1436 영화감독 숌  (0) 2022.06.23
[백준/C++] 1874번 스택 수열  (0) 2021.12.05
[백준/C++] 1259번 팰린드롬수  (0) 2021.12.04
[백준/C++] 5397번 키로거 List  (1) 2021.12.03
[백준/C++] 3273번 두 수의 합  (0) 2021.11.29