백준 11866 java 요세푸스 문제0 풀이
1. 문제 분석
1. 1번부터 N번까지 N명의 사람이 원을 이루고 앉아있다
: 특정 배열 또는 리스트의 처음과 끝이 연결되어 있다는 것이고 출제자의 의도는 큐였다.
하지만 본인은 큐를 아직 배우지 않았기 때문에 알고 있는 구현 방법에 한해서 풀고자 했다.2. 양의 정수 K만큼 자리를 확인하며 사람을 제거한다.
: 이미 제거된 사람인지의 여부를 확인할 식별자가 필요함(boolean 배열을 따로 만들거나 기존의 배열에서 특수 문자(0[N 양의 정수) 또는 절대 간섭을 받지 않을 문자)로 처리 - 본인 코드는 기존 배열의 수를 0으로 할당하여 구현하였다.3. 사람이 제거되는 순서 대로 출력하라.
: 제거된 사람을 담는 배열이 필요해 보인다.4. (*) 예제 출력이 A B C가 아니라 "<", "," , ">"와 같이 특수한 경우였다. 본인이 이 부분 때문에 Fail이 떴다.
2. 테스트케이스 분석
예시 1) 1 2 3 4 5가 앉아 있고 K가 2라면,
2 제거, 4 제거, 1 제거, 3 제거, 5제거 (제거되었던 사람이 겹치는 경우가 없음)예시 2) 1 2 3 4 5가 앉아 있고 K가 3이라면,
3 제거, 1제거, 5 제거, 2 제거, 4 제거 (제거되었던 사람이 3번째부터 발생)
3. 소스코드
참고사항
큐가 아닌 재귀로 해결한 케이스이다. (전날 알고리즘의 왕님의
재귀 강의가 있었기 때문에 더더욱 재귀를 쓰고 싶었ㄷ...)
import java.util.Scanner;
public class Boj_11866 {
private static int N;
private static int K;
private static int index;
private static int[] nums;
private static int[] answer;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
K = sc.nextInt();
nums = new int[N];
answer = new int[N];
for (int i = 0; i < nums.length; i++) { // 1~N으로 배열 초기화
nums[i] = i+1;
}
for(int i = 0; i < N; i++) { // 숫자 N개 전부 확인
for (int j = 0; j < K; j++) { // K번 만큼 이동하여 제거할 사람 탐색
index = move(index); // 제거하지 않은 사람 탐색하여 1만큼 이동.
}
// 배열의 인덱스의 경우 N-1까지 존재index가 0인 경우 N번째 사람에 해당함
if (index == 0) {
answer[i] = N;
} else {
answer[i] = index; // 제거한 사람 출력할 순서대로 담아두기
}
nums[index] = 0; // 제거 표시
}
// 출력
System.out.print("<");
for (int i = 0; i < N; i++) {
if (i == N-1) {
System.out.print(answer[i]+">");
} else {
System.out.print(answer[i] + ", ");
}
}
}
public static int move(int index) {
int tmpIndex = (index+1) % N;
if(nums[tmpIndex] != 0) { //1 이동 시 기확인 여부
return tmpIndex;
} else { // 확인하지 않은 곳 탐색
return move(tmpIndex);
}
}
}
4. 숙지할 내용
- 배열의 인덱스 초과 여부는 %(모듈러)를 통해 확인 가능함
- 탐색과 같은 중복된 동작에 대해서는 재귀를 통해 코드 반복 제거
- 제거 여부와 같은 2가지 경우를 조건으로 갖는 경우 boolean형 배열을 활용할 지 아니면 특수 문자로 처리할지(null, 0과 같은 초기화 값) 고려
- 출력할 값의 위치에 따라 stack, queue와 같은 자료구조를 활용하면 더욱 편함.
Author And Source
이 문제에 관하여(백준 11866 java 요세푸스 문제0 풀이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@chaaany/java-백준-11866-요세푸스-문제0저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)