15464번 The Bovine Shuffle | 뭐라도 하겠지

15464번 The Bovine Shuffle

이왜틀?


img01

15464번 The Bovine Shuffle - 백준

int n=Integer.parseInt(br.readLine());
int[][] arr=new int[n][2];
StringTokenizer st=new StringTokenizer(br.readLine()," ");
for(int i=0;i<n;i++) arr[i][0]=Integer.parseInt(st.nextToken());
st=new StringTokenizer(br.readLine()," ");
for(int i=0;i<n;i++) arr[i][1]=Integer.parseInt(st.nextToken());
Arrays.sort(arr,new Comparator<int[]>() {
    @Override
    public int compare(int[] a,int[] b) {
        return a[0]-b[0];
    }
});
for(int i=0;i<n;i++) bw.write(arr[i][1]+"\n");

좀 주석이랑 엔터 좀 해두지 좀
정렬 시도는 좋았다.
그런데 이 문제는 3회 셔플 후 결과를 제시하고 처음 순서를 구하는 거라 역순으로 3회 계산해야한다.

설계


예제를 보자.
1 3 4 5 2
2번 소를 3으로 보내고 3번 소를 4로 보내고 하는 식이다.
우리는 역순으로 찾아야 하므로
3번 소를 2로 가져오고 4번 소를 3으로 가져오는 식으로 처리해야 한다.

3번 반복을 시뮬레이션 해보면
2번째 소는 3 -> 4 -> 5, 현재 5번째 소
3번째 소는 4 -> 5 -> 2, 현재 2번째 소

실버 문제에서 트리를 그릴 필요는 없고 배열로 충분하다.

구현


N = int(input())

shuffle = list(map(int, input().split()))
cows = list(map(int, input().split()))

for i in range(N):
    idx = i
    for j in range(3):
        idx = shuffle[idx] - 1
    
    print(cows[idx])

채점


img02

반성


브론즈와 실버 문제의 차이는
브론즈는 그냥 쉽고 실버는 쉬운 문제를 말로 꼬아둔 느낌이다.
진짜 문제는 골드부터지.

코드 확인


Link to GitHub

Updated: