문제설명
입력 & 출력
나의 풀이
이번 문제는 요세푸스 순열에 대한 문제입니다.
요세푸스 순열이란 문제에서 나와있듯이 "원형으로 앉아 있는 N명의 사람들이 순서대로 제거되는 과정 "입니다.
이 때 매번 K번째 사람을 제거하며, 마지막 한 사람이 남을 때까지 이 과정을 반복합니다.
이해를 돕기위해 위 그림을 기준으로 예로 들자면 8명의 사람이 위와 같이 원형으로 앉아 있습니다.
1번째 사람부터 제거를 하면 3 ➡️ 6 ➡️ 1 ➡️ 5 ➡️ 2 ➡️7➡️4 ➡️ 8 순서로 제거가 됩니다.
- 초기 상태
- 1, 2, 3, 4, 5, 6, 7, 8
- 첫 번째 제거
- 1, 2, 3, 4, 5, 6, 7, 8 (3 제거)
- 두 번째 제거
- 4, 5, 6, 7, 8, 1, 2 (6 제거)
- 세 번째 제거
- 7, 8, 1, 2, 4, 5 (1 제거)
- 네 번째 제거
- 2, 4, 5, 7, 8 (5 제거)
- 다섯 번째 제거
- 7, 8, 2, 4 (2 제거)
- 여섯 번째 제거
- 4, 7, 8 (7 제거)
- 일곱 번째 제거
- 8, 4 (4 제거)
- 마지막으로 남은 사람
- 8
위와 같이 제거가 됩니다. 따라서 위 제거 과정을 기준으로 코드를 작성하면 됩니다.
먼저 빠른 입력을 위해서 Buffer를 사용하여 입력 N과K를 받아주고, 최종 반환을 위해 StringBuilder를 사용했습니다.
1부터 N까지 큐에넣어 큐를 초기화 합니다. 그리고 앞서 말한 제거 과정을 작성해야합니다.
요세푸스 규칙에 따라서 큐에 요소 즉 사람이 1명 남을 때 까지 반복하는 while문을 작성합니다.
그 다음 31번째 줄에서 K번째의 사람을 제거하기 위해서 K-1 까지 반복하는 반복문을 사용하여 K번째 앞까지 제거하여 큐의 뒤에 삽입합니다. 이는 poll() 메서드가 큐의 맨 앞 요소를 제거하는 특성을 활용한 것입니다.
그리고 최종적으로 반환할 StringBuilder에 append()메서드를 사용하여 K번째 요소를 계속해서 추가를 해줍니다.
그러면 최종적으로 sb에는 K번째로 제거된 사람이 존재하게 됩니다.
참고❗️
[JAVA] 입출력, BufferedReader, StringTokenizer, StringBuilder 알아보기
Java로 코딩테스트를 보거나 입력을 사용해야 할 때 Scanner 클래스를 사용하면 편리하지만 속도가 느리다는 단점이 있습니다. 그렇기 때문에 속도가 빠른 BufferReader 클래스를 사용을 하면 시간복
pixx.tistory.com
[자료구조 JAVA] 선형 구조 큐(Queue) 클래스 알아보기 ✔
Java를 활용하다 보면 데이터를 순차적으로 처리하거나, 특정 순서에 따라 데이터를 관리해야 할 때가 있습니다. 이때 사용할 수 있는 자료구조가 큐(Queue)입니다. 이 글에서는 Java의 큐(Queue)에
pixx.tistory.com
'Coding Test > 백준' 카테고리의 다른 글
[백준] 듣보잡 (HashSet, HashMap, getOrDefault, contains, sort, 1764번, Java) (0) | 2024.07.16 |
---|---|
[백준] 색종이 (구현, 2차원 배열, BufferReader, 2563번, Java) (1) | 2024.07.16 |
[백준] 영화감독 숌 (브루트 포스, contains, 1436번, Java) (1) | 2024.07.14 |
[백준] 2 x n 타일링 (동적 계획법, DP, 11726번, Java) (0) | 2024.07.13 |
[백준] 수 찾기 (이진 탐색 , Binary Search, Buffer, sort(), 1920번, Java) (0) | 2024.07.09 |