백준 1158

황상익·2023년 10월 23일
0

백준

목록 보기
4/15

백준1158

<문제 설명>
예시 (7, 3)

예제 입력
1 2 3 4 5 6 7

제거 시작
현 위치 0
제거 위치 :0 + K = 0 + 3 = 3
제거 3

1 2 4 5 6 7
현 위치 2
제거 위치 :2 + 3 = 5
제거 5

1 2 4 6 7
현 위치 4
제거 위치 :4 + 3 = 7
제거 : X - > 7 > 5(list.size) 초과 따라서 첫 위치로 돌아가면서 탐색
7 % 5 = 2
제거 2번

1 4 5 7
현 위치 1
제거 위치 :1 + K = 4
제거 7

1 4 5
현위치 3
제거 위치 :2 + K = 2 + 3 = 5
5>3(lsit.size) 첫 위치로 돌아가 탐색
5 % 2 = 3
제거 5

1 4
현 위치 2
제거 위치 : 2 + K = 5
5 > 2(list.size)
5%2 = 1
제거 4

package backjoon;

import java.io.*;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main1158 {
    public static void main(String[] args) throws IOException {
        //입력값 처리
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //결과를 출력하는 BufferedWriter
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        LinkedList list = new LinkedList();
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        for (int i = 0; i <= N; i++) {
            list.add(i);

            bw.write("<");
            int idx = 0; //현재 위치 변수
            while (list.size() > 1){
                /*
                K를 더했을 때 현재 인원수보다 커질 경우 원형으로 앉아서 처음 인원으로 돌아간다.
                 */
                idx = idx + (K-1) < list.size() ? idx + (K-1) : (idx + (K-1)%list.size());
                bw.write(list.get(idx) + " "); //제거된 사람 저장

                list.remove(idx); //사람 제거
            }

            bw.write(list.get(0)  +">"); // 마지막 남은 사람 bw에 저장
            bw.flush(); // 결과 출력 
            bw.close();
            br.close();
        }
    }
}

풀때 처음에 리스트를 뺄때 2칸씩 K-1 씩 이동 하면서 뺀다고 생각해서 풀려고 했더니, 생각보다 잘 코드가 안나왔다.
그래서 하나씩 제거를 하면서 리스트 크기에 따라 적용 되는 것을 찾아봐서 풀어보게 되었다.

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글