[C++] 백준 11866 : 요세푸스 문제 0

Kim Nahyeong·2022년 1월 7일
0

백준

목록 보기
39/157

#include <iostream>
#include <queue>
using namespace std;

int main(int argc, char **argv){ // Segfault
    int N, K, cnt = 1;
    queue<int> q;
    scanf("%d %d", &N, &K);

    for(int i=1; i<=N; i++){
        q.push(i); // 값 넣기
    }

    printf("<");
    while(!q.empty()){
        if(q.size() == 1){
            printf("%d", q.front());
            q.pop();
            break; // cnt == K일 때 아무것도 없는 q에서 front를 구하기 때문에 segfault
        }
        if(cnt == K){
            printf("%d, ", q.front());
            q.pop();
            cnt = 1;
        } else {
            q.push(q.front());
            q.pop();
            cnt++;
        }
    }
    printf(">");

    return 0;
}

오늘의 키포인트

  • 전에 풀었던 요세푸스와 같은 형태의 문제, 이번에는 큐를 제대로 사용해서 풀 수 있었다.
  • Segfault라는 런타임 에러가 발생했는데 바로 메모리 너머의 것을 사용하려고 했기 때문에 발생한 에러이다. q의 크기가 1일때 출력을 하고 반복문을 멈추게 해야했는데, 해당 break 처리를 하지 않아 cnt==K일 때 실행이 되고 여기서 아무것도 없는 q의 front값에 접근하려고 했기 때문에 생긴 에러이다. 반복문의 경우 이런 탈출 정의를 잘 해줘야하겠다.

0개의 댓글