백준오답 18870

하연·2021년 10월 12일
0
post-thumbnail

🟨 내 풀이:

1) 이중배열X 선언, int zip = 0
2) X[i][0]에 input값 넣고 X[i][1]에 순서 기억
3) X[i][0]기준으로 sort
4) i는 0부터 X[i][0].length-1 만큼 for문으로 비교 ( X[i][0] < X[i+1][0] ) 일 경우 X[i][0]=zip하고 zip++, 크지 않다면 X[i][0]=zip, zip은 그대로 두고 i값만 증가.
5)X[배열의크기-1][0] = zip
6)X[i][1]기준으로 sort

import java.util.*;
import java.io.*;
class Main {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int N = sc.nextInt();
      int[][] numbers = new int[N][2];
      int zip = 0;
      for(int a=0; a<N; a++){
        numbers[a][0]=sc.nextInt();
        numbers[a][1]=a;
      }
      Arrays.sort(numbers, Comparator.comparingInt(o1 -> o1[0]));
      for(int a=0; a<(N-1); a++){
       if(numbers[a][0] < numbers[a+1][0]){
          numbers[a][0] = zip;
          zip++;
        }else{
          numbers[a][0] = zip;
        }
      }
      numbers[N-1][0] = zip;
      Arrays.sort(numbers, Comparator.comparingInt(o1 -> o1[1]));
      for(int a=0; a<N; a++){
        System.out.print(numbers[a][0]+" ");
      }
      sc.close();
	}
}

시간 초과로 실패

🟩 해답:

1) 원본 배열, order=0
2)정렬된 새 배열을 생성
3) 정렬된 배열 탐색. 한번도 들어오지 않은 값이면 맵에 넣는다 넣을때마다 order++
맵에 대한 설명 : https://wikidocs.net/208
4)원본 배열을 탐색하며 원본 map.get로 인덱스값(order)을 얻어와 StringBuilder에 붙인다.
*printf를 쓰면 시간초과가 나온다. 시간 단축을 위해 StringBuilder를 사용한다.

StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) 
	sb.append(map.get(numbers[i])).append(" ");
System.out.println(sb);
import java.util.*;
import java.io.*;

class Main {
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    int[] numbers = new int[N];
    int count = 0;
    Map<Integer, Integer> map = new HashMap<>();

    for(int a=0; a<N; a++){
      numbers[a]=sc.nextInt();
    }
    int[] sorted = numbers.clone();
    Arrays.sort(sorted);

    for (int i = 0; i < N; i++) {
      if (!map.containsKey(sorted[i])) {
            map.put(sorted[i], count++);
        }
    }
    StringBuilder sb = new StringBuilder();
    for (int n : numbers){
      sb.append(map.get(n)).append(" ");
    }
    System.out.println(sb);
    sc.close();  
	}
}

0개의 댓글