[백준(JAVA)] 1158번: 요세푸스 문제

세하·2025년 4월 23일

[백준] 문제풀이

목록 보기
43/94
post-thumbnail

문제

✔ 난이도 - Silver 4

설명

❌ 처음에는 순회하면서 K의 배수들을 원래 리스트에서 remove() 하면서 정답 리스트에 add()해주는 방식으로 하려 했으나 그렇게 되면 기존 리스트가 계속 변경되어 인덱스가 꼬이게 된다. 즉, 한 번 끝까지 순회할때까지 리스트는 변동되면 안됨!


⭕ 리스트의 끝을 마주하면 다시 리스트의 처음으로 돌아가서 다시 순회하는 방식인데 그건 곧 한 번 쭉 훑으면서 조건에 만족하지 못하는 애들은 리스트의 맨 뒤로 보내는 것과 동일하다. 이 방식대로 진행.

처음에는 아래처럼 길게 코드를 씀

sb.append('<');
        while (list.size() != 0) {
            for (int i = 0; i < K; i++) {
                if (i != (K - 1)) {
                    list.add(list.remove());
                } else {
                    if (list.size() != 1) {
                        sb.append(list.remove()).append(", ");
                    } else {
                        sb.append(list.remove());
                    }
                }
            }
        }
        sb.append('>');

그러나 이렇게 쓰면 조금 더 간결하게 코드를 구성할 수 있음

sb.append('<');
        while (list.size() != 0) {
            for (int i = 0; i < K - 1; i++) {
                list.addLast(list.removeFirst());
            }
            sb.append(list.removeFirst());
            if (list.size() != 0){
                sb.append(", ");
            }
        }
        sb.append('>');

풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();

    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    int N = Integer.parseInt(st.nextToken());
    int K = Integer.parseInt(st.nextToken());

    LinkedList<Integer> list =  new LinkedList<>();
    for (int i = 1; i <= N; i++){
        list.add(i);
    }

    sb.append('<');
    while (list.size() != 0) {
        for (int i = 0; i < K; i++) {
            if (i != (K - 1)) {
                list.add(list.remove());
            } else {
                if (list.size() != 1) {
                    sb.append(list.remove()).append(", ");
                } else {
                    sb.append(list.remove());
                }
            }
        }
    }
    sb.append('>');

    System.out.println(sb);
}

}


### TIL💡
📌 remove(index)나 remove()를 사용하면 삭제한 값을 리턴받을 수 있으므로 리턴받은 값으로 다시 어떠한 작업을 수행하는 방식도 존재한다는 것을 기억하자!

📌 https://velog.io/@seha01130/LinkedList-메소드-정리

![](https://velog.velcdn.com/images/seha01130/post/8235426a-bc11-4e3c-912c-7167b7a67e56/image.png)

![](https://velog.velcdn.com/images/seha01130/post/552f57a4-2b28-4c3b-9676-e2da6f6e6955/image.png)


0개의 댓글