코딩테스트/문제풀이

[코드트리]정렬된 숫자 위치 알아내기

알렉스 페레이라 2023. 4. 18. 09:27

양의 정수를 원소로 갖는 길이가 N인 수열이 입력으로 주어졌을 때, 이 수열을 오름차순으로 정렬 했을 때 각각의 위치에 있던 원소가 어느 위치로 이동하는지 출력하는 코드를 작성해보세요.

 

입력 형식

첫째 줄에는 수열의 길이를 나타내는 양의 정수 N이 주어지고, 둘째 줄에는 N개의 양의 정수인 원소가 빈칸을 사이에 두고 주어집니다. 숫자가 중복되어 주어질 수 있습니다.

  • 1 ≤ N ≤ 1,000
  • 1 ≤ 수열의 원소 ≤ 1,000,000

 

출력 형식

이 수열을 정렬했을 때 각각의 위치에 있던 원소가 어느 위치로 이동하는지를 공백을 사이에 두고 출력하는 코드를 작성해보세요. 동일한 원소의 경우, 먼저 입력으로 주어진 원소가 더 앞으로 와야 합니다.

 

 

입출력 예제

예제1

 

입력 : 

7
3 1 6 2 7 30 1

 

출력

4 1 5 3 6 7 2

 

예제 설명
입력으로 주어진 수열을 정렬하면 1 1 2 3 6 7 30 이 됩니다.
첫 번째 원소인 3은 네 번째 위치로, 두 번째 원소인 1은 첫 번째 위치로, .. 이동해야 하므로 답은 4 1 5 3 6 7 2 가 됩니다.

 


객체정렬을 하는 문제다 Class생성후 Comparable<T>를 상속받아서 풀면 되는 문젠데 '정렬한 값이 어디로 이동했는지' 라는말이 좀 헷갈려서 정리함..

 

 

import java.util.*;

class Node implements Comparable<Node>{
    int num;
    int index;

    public Node(int num, int index){
        this.num = num;
        this.index = index;
    }

    @Override
    public int compareTo(Node node){
        if(this.num == node.num){
            return this.index - node.index;   // -> 숫자로 정렬, 숫자가 같다면? index로 정렬
        }else{
            return this.num - node.num;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        Node[] nodeArr = new Node[N];
        int[] answer = new int[N];

        for(int i = 0; i < N; i++){
            nodeArr[i] = new Node(sc.nextInt(), i); //-> 인덱스를 같이 받아 insert.
        }

        Arrays.sort(nodeArr); //정렬

        for(int i = 0; i < N; i++){
            answer[nodeArr[i].index] = i+1; // 어디로 갔는지 기록 작업. index의 index라고 생각하면 편할거같다.
                                            // node.index값이 7이라면 7번째에서 왔기때문에 answer[6]에 현재 위치를 넣는다.
                                            // ex) nodeArr[2] = 7 -> 7번째있는애가 2번째로 갔다는 뜻.
        }

        for(int ans : answer){
            System.out.print(ans + " ");
        }
    }
}