728x90

문제

n명의 사람이 원을 그리며 앉아 있을 때 k번째 사람을 한 명씩 빼주는 문제로

리스트를 계속 돌아야 한다.

 

접근 방식

7명의 사람이 원을 그리며 앉아 있을 때

진행 과정은 아래와 같다.

 

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

1, 2, 4, 5, 6, 7

1, 2, 4, 5, 7

1, 4, 5, 7

1, 4, 5

1, 4

4

 

결과는 <3, 6, 2, 7, 5, 1, 4> 라는 순열이 만들어 진다.

 

결국 1부터 n번째 사람이 모두 빠질 때까지 반복문을 돌면서

빠지는 순서대로 출력 버퍼에 추가해주면 된다.

 

문제가 하나 있는데 리스트의 끝까지 왔다면 다시 처음으로 돌아가야 한다.

이터레이터는 전후 한 칸 이동만 가능하기 때문에 처음으로 갈 수가 없다.

 

iterator = list.listIterator();
iterator = list.listIterator(0);

 

이터레이터를 초기화 하면 항상 0번째 인덱스부터 시작하고

특정 인덱스부터 시작하고 싶은 경우에는 해당 인덱스 번호를 파라미터로 주면 된다.

 

풀이

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		bw.write("<");

		String[] input = br.readLine().split(" ");
		int n = Integer.parseInt(input[0]);
		int k = Integer.parseInt(input[1]);

		LinkedList<Integer> list = new LinkedList<>();

		for (int i = 1; i <= n; i++) {
			list.add(i);
		}

		ListIterator<Integer> iterator = list.listIterator();

		int cur = 0;

		while (!list.isEmpty()) {
			if (list.size() == 1){
				bw.write(list.get(0) + "");
				list.remove(0);
			}
			else {
				for (int i = 0; i < k; i++) {
					if (iterator.hasNext()) {
						cur = iterator.next();
					} else {
						iterator = list.listIterator();
						cur = iterator.next();
					}

					if (i == k - 1 && list.size() > 1) {
						bw.write(cur + ", ");
						iterator.remove();
					}
				}
			}

		}

		bw.write(">");
		bw.flush();
		bw.close();
	}
}

 

자바에서 LinkedList는 Queue의 구현 클래스이기도 해서

나중에 이 문제를 다시 큐를 사용해서 풀어보겠다.

'Java > Algorithms' 카테고리의 다른 글

[백준] 10773번 : 제로  (0) 2023.10.01
[백준] 10828번 : 스택  (0) 2023.10.01
[백준] 5397번 : 키로거  (0) 2023.09.29
[백준] 1406번 : 에디터  (0) 2023.09.29
[백준] 3273번 : 두 수의 합  (0) 2023.09.28

+ Recent posts