문제풀이/백준oj
[백준OJ] 2160번 그림 비교 - Java
Hyeon-Uk
2023. 1. 2. 19:51
반응형
https://www.acmicpc.net/problem/2160
2160번: 그림 비교
N(2 ≤ N ≤ 50)개의 그림이 있다. 각각의 그림은 5×7의 크기이고, 두 가지 색으로 되어 있다. 이때 두 가지의 색을 각각 ‘X’와 ‘.’으로 표현하기로 하자. 이러한 그림들이 주어졌을 때, 가장 비
www.acmicpc.net
풀이
5*7 사이즈의 격자판이 최대 50개이기 때문에 모든 그림을 하나하나 비교해도 시간초과가 나지 않을것입니다.
하지만 5*7사이즈의 격자판을 비교하는 시간을 줄이기 위해 비트연산자 XOR을 이용했습니다.
예를들어
..X....
.XXX...
.XX....
.....X.
.X...X.
와 같은 격자판을 일자로 늘려
..X.....XXX....XX.........X..X...X.
로 만든 뒤, X = 0, '.' = 1로 치환합니다.
11011111000111100111111111011011101
그림을 모두 BIT로 치환한 뒤, 각각의 그림을 모두 XOR 연산을 이용하여 비교하며 서로 다른부분이 몇개인지 도출해내며 답을 갱신하면 됩니다.
시간복잡도
O(N*N)
코드
import java.io.*;
public class Main {
public static int getBitCount(long diff){
int ret = 0;
while(diff>0){
if(diff%2==1) ret++;
diff/=2;
}
return ret;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.valueOf(br.readLine());
long[] arr = new long[n];
for(int i=0;i<n;i++){
long number=0;
for(int x=0;x<5;x++){
String line = br.readLine();
for(char c : line.toCharArray()){
number<<=1;
if(c=='.'){
number+=1;
}
}
}
arr[i]=number;
}
int diffCount = Integer.MAX_VALUE;
int answer1=0;
int answer2=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
long diff = arr[i]^arr[j];
int bitCount = getBitCount(diff);
if(bitCount < diffCount){
diffCount=bitCount;
answer1 = i+1;
answer2 = j+1;
}
}
}
sb.append(answer1+" "+answer2);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(sb.toString());
bw.flush();
}
}
반응형