728x90
❓ 좌표 압축
🏷️ 관련 주제 : Sort

💦 나의 시도
Set과 정렬, Map을 사용한 방법
- int
N에 입력값을 형변환하여 할당 : 입력할 값의 개수 - StringTokenizer
st로 입력값 받기 - int[]
X를 길이N인 int 배열로 선언 : 입력값을 넣을 배열
좌표 압축 결과 $X'_i$의 값은 $X_i$ 보다 작은 서로 다른 $X_j$의 개수
서로 다른 값의 개수를 세므로 중복값을 허용하지 않는Set을 사용해보자. - Set
xSet을 선언 :X의 원소를 중복되지 않게 담을 Set - 0 ~ (N - 1) 범위를 반복문 돌기
i는 반복문의 int 변수X[i]에StringTokenizer의nextToken()값을 변환하여 할당xSet에X[i]추가
- Stream API를 사용하여
xSet의 원소를 오름차순 정렬하여 int[]xArr에 할당
이때,xArr의i번 인덱싀의 값의 좌표 압축 결과는i - 각 좌표에 대한 좌표 압축 결과를 담을 Map<Integer, Integer>
cntMap선언- 키 : 좌표
- 값 : 좌표 압축 결과
- 0 ~
xArr.length범위를 반복문 돌면서cntMap에xArr[i]를 키로,i를 값으로 넣기 - for-each문으로
X의 원소를 하나씩 꺼내기(x)cntMap에서 좌표 압축 결과를 꺼내(cntMap.get(x)) 공백(" ")을 붙여BufferedWriter에 쓰기
BufferedWriter의close()메서드를 사용해 결과값 출력하기
📑제출 기록 및 오답 원인

💯 해결 방법
import java.io.*;
import java.util.*;
public class Main {
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());
int[] X = new int[N];
Set<Integer> xSet = new HashSet<>();
for (int i = 0; i < N; i++) {
X[i] = Integer.parseInt(st.nextToken());
xSet.add(X[i]);
}
int[] xArr = xSet.stream().sorted().mapToInt(i -> (int) i).toArray();
Map<Integer, Integer> cntMap = new HashMap<>();
for (int i = 0; i < xArr.length; i++) {
cntMap.put(xArr[i], i);
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int x : X) {
bw.write(cntMap.get(x)+ " ");
}
bw.close();
}
}
🏷️ 문제 풀면서 참고한 내용
- Java의 int 타입은 -2,147,483,648 ~ 2,147,483,647 의 범위까지 저장할 수 있습니다.
728x90