본문 바로가기
알고리즘

백준 18870 좌표 압축(java)

by 창따오 2023. 12. 18.
728x90

출처 :https://www.acmicpc.net/problem/18870

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

public class Baek18870 {
   /* //Set 사용하기
    static int n;
    static int[] srcNums;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Set<Integer> hashSet = new HashSet<>();
        n = Integer.parseInt(br.readLine());
        srcNums = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            int num = Integer.parseInt(st.nextToken());
            srcNums[i] = num;
            hashSet.add(num);
        }// srcNums 배열 초기화
                                        //java 17에서는 sorted 다음 바로 toList() 가능
                                        //but, 아래 버전 .collect 써야함.
        List<Integer> sortedArr = hashSet.stream().sorted().collect(Collectors.toList());
        for (int i = 0; i < n; i++) {
            int cnt = 0;
            int compareTarget = srcNums[i];
            for (int c : sortedArr) {
                if (compareTarget > c)
                    cnt++;
                else break;
            }
            sb.append(cnt).append(" ");
        }

        System.out.println(sb.toString());
    }*/
    static int n;
    static int[] srcNums;
    static int[] sortedNums;
    //HashMap 이용하여 순위 매기기
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Map<Integer, Integer> map = new HashMap<>();
        n = Integer.parseInt(br.readLine());
        srcNums = new int[n];
        sortedNums = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            int num = Integer.parseInt(st.nextToken());
            srcNums[i] = num;
            sortedNums[i] = num;
        }
        Arrays.sort(sortedNums);
        int rank = 0;
        for (int num : sortedNums) {
            if (!map.containsKey(num)) {
                map.put(num, rank);
                rank++;
            }
        }
        for (int i = 0; i < n; i++) {
            sb.append(map.get(srcNums[i])).append(" ");
        }
        System.out.println(sb.toString());
    }

}

 

느낀점 : 처음에는 HashSet을 사용하여 문제 풀이를 했다. 시간초과가 발생했고, O(N)의 HashMap을 사용해야지만, 시간초과가 발생하지 않을 수 있었다. 이유는 소스코드의 동작을 보면 HashSet을 사용한 경우, 전체 n을 순회하면서 각 HashSet의 오름차순 값을 비교하며 cnt를 증가시키고 있는데 데이터 N이 백만이고, HashSet을 사용하더라도, N이 동일 값이 아니라 1,2,3,4 ....N의 값이라면 거의 백만 * 백만의 시간복잡도를 가진다 O(N^2)

'알고리즘' 카테고리의 다른 글

프로그래머스 양과 늑대 (자바)  (2) 2023.12.23
백준 1946 신입사원 java  (0) 2023.12.23
백준 1027 고층건물(Java)  (0) 2023.12.18
백준 2252 줄 세우기 (java)  (2) 2023.12.06
백준 11066 파일합치기 (java)  (0) 2023.12.05