🟨 내 풀이:
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();
}
}