새소식

알고리즘 문제풀이/BOJ

[BOJ] 백준 1158번 요세푸스 문제 자바(java) 풀이(큐, 리스트)

  • -

BOJ 1158번 요세푸스 문제1 자바(java) 풀이

문제 정리

  1. 1~N번까지 N명의 사람이 원 모양으로 앉아있다.
  2. k가 주어질때 k번째 사람을 제거한다.
  3. 한 사람이 제거되면 남은 사람들로 이루어진 원에서 2번을 반복한다.
  4. N명의 사람이 모두 제거될 때까지 계속된다.
  5. 사람들이 제거 되는 순서를 출력해라.


문제 풀이

이 문제는 요세푸스 문제0번과 똑같이 제출해도 통과할 수 있습니다.
즉 naive하게 문제에서 주어진대로 구현하면 통과할 수 있습니다.
하지만 이 문제는 queue를 이용하여 작성해보았습니다.
queue에서 뺄 필요 없이 ArrayList를 이용하면 뺏다 넣었다 하지 않기 때문에 더 빠르게 가능합니다.

  1. 1~N까지 queue에 모두 넣습니다.
  2. k-1번째 까지 숫자를 빼서 뒤에 차례로 넣습니다.
  3. k번째 사람을 제거하고 출력합니다.
  4. 2,3번을 queue에 1개가 남을때까지 반복합니다.
  5. 마지막 element를 출력형식에 맞게 출력합니다.


문제 풀이

  1. naive한 풀이
  • 실행시간: 2024ms
  • 메모리: 22020 KB
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    

class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
boolean[] visited = new boolean[n+1];

    int idx = k;
    int flag = n;
    System.out.print("<");
    while(flag > 1){
        int cnt = 0;    // 몇 번째 사람인지
        System.out.print(idx + ", ");

        // 사람 제거
        visited[idx] = true;

        // 남은 사람수
        flag--;
        while(true){
            // 원으로 되어있으므로 n을 넘어가는 경우 처리해준다.
            // 0인 경우는 index는 1부터 시작이므로 1로 해준다.
            idx = ((idx+1) % (n+1)) == 0 ? 1 : (idx+1) % (n+1);

            // 죽지 않은 사람 체크
            if(!visited[idx])
                cnt++;
            // k번째 사람을 찾은 경우
            if(cnt == k)
                break;
        }
    }

    System.out.println(idx + ">");        
}

}

<br><br>

2. <span style="color:blue; font-size:13pt">queue이용한 풀이</span>
- 실행시간: 524ms
- 메모리: 278312 KB
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.LinkedList;

class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        Queue<Integer> q = new LinkedList<>();
        StringBuilder sb = new StringBuilder();

        sb.append("<");

        // q에 N명의 사람 넣기
        for(int i=1; i<=n; i++)
            q.offer(i);

        while(q.size() > 1){
            // k-1번 째 사람까지 queue에서 빼서 넣기
            for(int i=0; i<k-1; i++)
                q.offer(q.poll());

            sb.append(q.poll() + ", ");    // k번째 사람 제거
        }
        sb.append(q.poll() + ">");
        System.out.println(sb);
    }
}



Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.