ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 11870 좌표 압축(자바)
    개발/코딩테스트 2023. 3. 2. 22:14

    문제를 설명하면

    수직선 위에 좌표 x1, x2, ... xN이 있는데 좌표에 좌표압축을 적용하려고 한다

    첫번째줄에는 N이 주어지고 두번째줄에는 x1, x2, ... xN이 주어진다

     

    이 문제도 꽤 오래걸렸다

    시간초과문제로 계속 틀렸다

    일단 full code는 

     

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = sc.nextInt();
            }
            sc.close();
    
            int[] sorted = Arrays.stream(a).distinct().sorted().toArray();
    
            HashMap<Integer, Integer> map = new HashMap<>();
            for (int i = 0; i < sorted.length; i++) {
                map.put(sorted[i], i);
            }
    
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < n; i++) {
                sb.append(map.get(a[i])).append(' ');
            }
            System.out.println(sb);
        }
    }

     

    처음부터 보면

     

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] a = new int[n];
    for (int i = 0; i < n; i++) {
        a[i] = sc.nextInt();
    }
    sc.close();

     

    스캐너를 sc로 생성하고

    정수 n을 읽어오고

    int 배열 a를 생성하고 n개의 정수를 입력받아서 배열 a에 차례대로 저장한다

    하도 시간초과 시간초과 해서 sc를 닫았다

     

    int[] sorted = Arrays.stream(a).distinct().sorted().toArray();

     

    다른 방법을 시도해도 안돼서 스트림을 썼다

    이번에 처음 써봤다

    array에서 stream으로 바꾸고 distinct()로 중복제거하고 sorted로 오름차순 정렬하고

    toArray()로 정렬된 요소들을 다시 배열로 변환해서 int[] sorted 에 저장한다

     

    HashMap<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < sorted.length; i++) {
        map.put(sorted[i], i);
    }

     

    배열 a에 저장되어있던 각각의 요소를 sorted의 인덱스에 매핑하기 위해

    HashMap map을 생성하고

    sorted 길이만큼 반복하여 각 요소를 키로하여 map에 추가하고 값은 sorted 각 요소의 인덱스로 한다

     

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < n; i++) {
        sb.append(map.get(a[i])).append(' ');
    }
    System.out.println(sb);

     

    StringBuilder sb를 생성해서 출력 문자열을 만들었다

    n번 반복하여 map을 사용해서 get으로 a의 요소를 호출해서 이에 해당하는 값(인덱스)를 가져와서

    한칸 띄워서 sb에 추가한다

    sb를 출력한다

     

     

    '개발 > 코딩테스트' 카테고리의 다른 글

    [백준] 1000 A+B (자바)  (0) 2023.03.03
    [백준] 1181 자바 java  (0) 2023.02.28

    댓글

Designed by Tistory.