PS
[백준] 2205번 : 저울 추 만들기[Java]
devkdh
2025. 7. 27. 19:29

#풀이
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
static int[] square = new int[20];
static int findNum(int n){
for(int i = 1; i<20; i++){
if(n<square[i])return square[i];
}
return 0;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] ans = new int[n];
square[0] = 1;
for(int i = 1; i<20; i++){
square[i] = square[i-1]*2;
}
for(int i = n-1; i>=0; i--){
if(ans[i]!=0)continue;
int num = findNum(i+1);
ans[i] = num-(i+1);
ans[num-(i+1)-1] = i+1;
}
for(int i = 0; i<n; i++){
System.out.println(ans[i]);
}
}
}
#성능

#정리
1. 각 납덩어리에 대해, 해당 질량보다 크고 가장 가까운 2의 거듭제곱 수를 구한다.
2. 해당 거듭제곱 수를 기준으로, 납덩어리와 짝이 될 주석덩어리의 질량을 계산한다.
이때, 주석덩어리가 아직 사용되지 않았다면, 서로를 짝지어 ans 배열에 저장한다.
3. 자기 자신과 짝이 되는 경우도 허용된다. (예: (4,4)처럼)
4. 이렇게 하면 모든 납덩어리와 주석덩어리가 1:1로 매칭되며, 각 쌍의 합이 항상 2의 거듭제곱이 되는 저울추를 정확히 n개 만들 수 있다.
골드 문제인데 체감난이도는 많이 쉬웠다.