제출 코드
문제에서 주어진 코드를 읽고, 출력된 배열의 로직을 이해한 후 거꾸로 시행하여 다시 출력하는 문제이다. 다소 복잡해 보이나, 이해하고 나면 간단하다.
원 코드의 로직은 다음과 같다.
- 인덱스 0에서부터 시작
- 이미 출력한 수라면, 출력하지 않은 수를 만날때까지 인덱스++
- 이미 출력한 수가 아니라면, 출력 후 해당 값만큼 인덱스 이동
- 모든 수를 출력할 때까지 2~3 반복
위의 코드로 출력된 배열은, 바로 옆의 수는 현재 인덱스에서 현재값을 더한값
을 인덱스로 가진다는 특징이 있다.
위 특징을 고려한 이번 코드 로직은 다음과 같다.
- 인덱스 0에서부터 시작, 빈 배열 생성
- 입력값 처음부터 순서대로 빈 배열에 넣을것이다.
- 인덱스에 해당하는 자리가 비어있다면, 바로 넣기
- 비어있지 않다면, 비어있는 자리가 나올때까지 인덱스++
- 모든 입력값을 넣을때까지 3~4 반복
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package gold;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class G8981_inputNumber {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] str = br.readLine().split(" ");
int[] result = new int[N];
int idx = 0;
for(int i=0; i<N; i++) {
while(result[idx]!=0) idx = (idx+1)%N;
result[idx] = Integer.parseInt(str[i]);
idx = (idx+result[idx])%N;
}
System.out.println(Arrays.toString(result).replace("[", "").replace(",", "").replace("]", ""));
}
}