ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 18870번 문제풀이 자바
    개발/코테문제풀이 2023. 5. 23. 16:57
    728x90

     

    문제이해

     

    N을 입력받아, N개에 해당하는 좌표들의 랭킹(?)값을 출력해주는 문제이다.

     

    입력받은 숫자들을 오름차순으로 정렬해 왼쪽부터 0~N 랭킹을 매겨주고

     

    정렬하기전 입력값들의 해당 랭킹들을 매겨 출력해주면 된다. 

     

     

    코드풀이

     

    /*  백준 18870번 문제풀이)

        수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.
        Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다.
        X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.

        입력)
        첫째 줄에 N이 주어진다.
        둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.

        출력)
        첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.
     *
     */
    package test_0523;

    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Scanner;

    public class test_0523_1 {
        public static void main(String[] args){
            Scanner in = new Scanner(System.in);
           
            int N = in.nextInt();

            //원본배열과 바꾼배열생성
            int [] origin = new int[N];
            int [] change = new int[N];

            //해쉬맵을 통해 키,밸유값으로 저장하기위해 생성.
            HashMap<Integer,Integer> rankingMap = new HashMap<Integer, Integer>();

            //배열에 입력값 저장
            for(int i=0; i<N; i++){
                change[i]=origin[i]=in.nextInt();
            }

            //ex) 입력값이 2,4,-10,4,-9 라면
            //change배열을 정렬해준다.  -10,-9,2,4,4 형태로 저장된다.
            Arrays.sort(change);

            //rank는 순서값으로 사용한다.
            int rank =0;
            //-10,-9,2,4,4형태로 저장된 change배열을 반복문을통해 v에 주입해준다.
            for(int v : change){
                //containsKey를 통해 rankingMap에 이미 존재하는지, 존재여부를 확인한다
                if(!rankingMap.containsKey(v)){
                    //rankingMap에(-10,0),(-9,1)...(4,3) 키와 밸유형태로 저장해준다
                    rankingMap.put(v, rank);
                    rank++;
                }
            }

            StringBuilder sb = new StringBuilder();

            //origin은 정렬되기전의 값 (2,4,-10,4,-9)의 형태로 순서대로 key에 주입해준다.
            for(int key : origin){
                //ranking은 key에 해당하는 rank를 불러오고
                //해당 값을 sb에 저장해준다.
                //1번째 반복문 : origin의 2          rankingMap.get(2)에 해당하는 rank값 2
                //2번째 반복문 : origin의 4          rankingMap.get(4)에 해당하는 rank값 3
                //3번째 반복문 : origin의 -10        rankingMap.get(-10)에 해당하는 rank값 0
                //4번째 반복문 : origin의 4           rankingMap.get(4)에 해당하는 rank값 3
                //5번째 반복문 : origin의 -9         rankingMap.get(-9)에 해당하는 rank값 1
                int ranking = rankingMap.get(key);

                //sb에 ranking값을 추가해주고,
                sb.append(ranking).append(' ');
            }
            //마지막으로 sb를 출력해주면 결과값을 얻을 수 있다.
            System.out.println(sb);
        }
    }

     

    추후에 다시 볼 때 확인하려고 주석을 많이달았더니 많이 복잡해보인다.

     

    두개의 배열을 생성해, 원본배열인 origin 정렬한배열인 change를 생성했고

     

    HashMap을 생성해 key,value값으로 저장해서 원본배열에서 해당값의 rank를 불러올때 사용할 것이다.

     

    change배열은 정렬을해주고

     

    반복문을 통해 HashMap인 rankingMap에 해당값을 key rank를 value 값으로 저장한다.

     

    StringBuilder sb를 생성해서

     

    원본배열의 값들의 해당하는 rank를 불러와 sb에 저장해준다.

     

    그후 마지막에 출력해준다.

     

     

    결과

    728x90

    댓글

Designed by Tistory.