알고리즘 연습 심화 - 5

조재형·2023년 5월 31일
0

요세푸스 문제를 풀어보았다.

요세푸스 문제는 다음과 같다.

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다.
이제 순서대로 K번째 사람을 제거한다.
한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다.
이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다.
예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

1, 2, 3, 4, 5, 6, 7
1, 2, , 4, 5 ,6, 7
1, 2, , 4, 5, , 7
1, , , 4, 5, , 7

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

이 문제를 풀기 위해서 일단

코드를 어떻게 짜야할지 고민을 해 보았다.

N K 입력받기
1번부터 N번까지 순열 큐 A 만들기
K번째 큐를 빼서 큐 B에 넣기
만약 큐 A의 길이가 K보다 작아지면 K - A 의 길이 = K 로 바꿔서 다시하기
큐 A의 길이가 0이 될때까지 루프. 0이 되면 종료.
큐 B 출력하기

이런식으로 짜면 될 것 같다.

Scannse scna = new Scanner(System.in); //스캐너를 불러오고

int N = scan.nextInt(); // N명의 사람이 원을 그릴 때 N명 입력받기
int K = scan.nextInt(); // K번째 사람 빼기, K를 입력받기

Queue<Integer> queue = new LinkedList<>();
// 이부분이 이해가 잘 안되었는데, 
// StringBuilder sb = new StringBuilder(); 
// 와 같은 말이라고 한다.

String s = ""; //위의 따로 설명한 말과 같은 의미이다.

for (int i = 1; i <= N; i++){
            queue.add(i);

        }
        while(!queue.isEmpty()){
            for(int j =0; j< K-1; j++) {
                int in = queue.poll();
                queue.add(in);
            }
            //sb.append(queue.poll()+"\n");
            s+= queue.poll()+"\n"; // 이 부분도 이해가 잘 안되었는데, 위의 주석처리한 부분과 같은 의미이다.

        }
        //System.out.println(sb.toString());// K번째 값을 출력하고 뺀다
        System.out.println(s); // 위의 주석처리한 부분과 같은 의미이다.

    }
}

이렇게 코드를 짜 보았는데,

모르는 부분이 많아서 이해를 돕는데에 다른 분의 도움을 받았다.

이렇게 풀어보고 또 다시 백지로 이 문제를 다시 풀어 보았는데,

아무것도 안 보고 온전히 풀기 아주 어려웠다.

새로 푸는것이 꽤 나에게 도움 된다는 것을 깨달았다.

profile
안녕하세요.

0개의 댓글