[백준] 10867 중복빼고 정렬하기 (JAVA)

suRan·2022년 8월 23일
0

🤖 백준

목록 보기
3/3

📜 문제

https://www.acmicpc.net/problem/10867


문제 분석

  • 핵심 포인트
    오름차순으로 정렬 → Collection.sort() 활용
    같은 정수는 한 번만 출력 (중복을 허용하지 않는다) → 해쉬셋 활용



🎯 풀이

알고리즘 알고 풀기

  • 정렬
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class jun_10867 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        Set<Integer> set = new HashSet<>(); // 중복 제거 : 해쉬셋의 특성

        for (int i = 0 ; i < n ; i++){
            set.add(Integer.parseInt(st.nextToken())); // n번 반복해서 Hashset에 입력해준다.
        }

        ArrayList<Integer> arry = new ArrayList<>(set);
        Collections.sort(arry); // 오름차순 정렬 : Collection클래스의 sort메소드

        // arry배열의 출력 포맷 맞추기 : 속도를 향상시키기 위해 StringBuilder사용
        StringBuilder sb = new StringBuilder();
        for (int i : arry) {
            sb.append(i).append(" ");
        }
        System.out.println(sb.toString());
    }
}



시간복잡도

public class jun_10867 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        Set<Integer> set = new HashSet<>(); 

        for (int i = 0 ; i < n ; i++){ // O(n)
            set.add(Integer.parseInt(st.nextToken())); 
        }

        ArrayList<Integer> arry = new ArrayList<>(set);
        Collections.sort(arry); // O(nlogn)을 보장

      
        StringBuilder sb = new StringBuilder();
        for (int i : arry) { // O(n)
            sb.append(i).append(" ");
        }
        System.out.println(sb.toString());
    }
}

// O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!) < O(nⁿ)
// 시간 복잡도는 O(n log n) 



공간복잡도

  • 알고리즘의 특성과 밀접한 관계가 있는 부분, 즉 문제를 해결하기 위해 반드시 필요한 부분만을 계산한다.
  • 공간 복잡도는 가변 공간에 좌우된다.
  • 크기가 N인 1차원 배열을 만든다면 필요한 공간은 O(n)이다. 크기가 NxN인 2차원 배열을 만들면 필요한 공간은 O(N²)이 된다.
  • 함수의 재귀적인 호출의 경우 스택 공간도 고려해야 한다.
public class jun_10867 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        // set을 저장하기 위한 공간 = n
        Set<Integer> set = new HashSet<>(); 

        //  i, n을 위한 공간 = n + 2
        for (int i = 0 ; i < n ; i++){ 
            set.add(Integer.parseInt(st.nextToken())); 
        }
		
        // arry를 저장하기 위한 공간 = n
        ArrayList<Integer> arry = new ArrayList<>(set);
        Collections.sort(arry); 

      
        StringBuilder sb = new StringBuilder();
        for (int i : arry) {
            sb.append(i).append(" ");
        }
        System.out.println(sb.toString());
    }
}

// 3n + 2 = O(n) 
// 공간복잡도는 O(n)



시간 복잡도와 공간 복잡도는 공부하면서 스스로 계산해본 것이므로 정답이 아닐 가능성이 있습니다.

Ref

profile
개발 공부를 해라

0개의 댓글