728x90
오늘은 구현 문제!
https://www.acmicpc.net/problem/21277
겹치는 부분 확인하는걸 구현해야한다.
외우면 좋을 부분은 90도 회전하는 부분이다.
static void turn(){
boolean[][] newArr = new boolean[arr2[0].length][arr2.length];
for(int i = 0; i < newArr.length; i++){
for(int j = 0; j < newArr[0].length; j++){
newArr[i][j] = arr2[arr2.length - 1 - j][i];
}
}
arr2 = newArr;
}
static void turn(){
int[][] newMap = new int[map2[0].length][map2.length];
for (int i = 0; i < map2.length; i++) {
for (int j = 0; j < map2[0].length; j++) {
newMap[map2[0].length -j -1][i] = map2[i][j];
}
}
map2 = newMap;
}
오래걸린 부분은 왼쪽, 위로도 갈 수 있는데 그부분은 생각 못하고 0,0부터 확인을 하였다.
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
static int N1, M1, N2, M2, min = Integer.MAX_VALUE;
static boolean[][] arr1, arr2;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
input(br);
pro();
}
static void pro() {
for(int k = 0; k < 4 ; k++){
for(int i = arr2.length*-1; i <= N1; i++) {
for(int j = arr2[0].length*-1; j <= M1; j++) {
// if(min < Math.max(arr1.length, arr2.length+i) * Math.max(arr1[0].length, arr2[0].length+j)) continue;
boolean flag = true;
for(int i2 = 0 ; i2 < arr2.length ; i2++) {
for(int j2 = 0 ; j2 < arr2[0].length ; j2++) {
if(i2+i<0 || j2+j < 0 || i2+i >= arr1.length || j2 + j >= arr1[0].length) continue;
if(arr1[i2+i][j2+j] && arr2[i2][j2]){
flag = false;
break;
}
}
if(!flag) break;
}
// soutArr(arr1);
// soutArr(arr2);
// System.out.printf("%d, %d, %s\n", i, j, flag);
if(flag) {
int top = Math.min(0, i);
int bottom = Math.max(arr1.length, i + arr2.length);
int left = Math.min(0, j);
int right = Math.max(arr1[0].length, j + arr2[0].length);
int area = (bottom - top) * (right - left);
min = Math.min(min, area);
}
}
}
if(k==3) break;
turn();
}
System.out.println(min);
}
static void soutArr(boolean[][] arr){
System.out.println();
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[0].length; j++){
if(arr[i][j]) {
System.out.print(1);
}else{
System.out.print(0);
}
}
System.out.println();
}
}
static void turn(){
boolean[][] newArr = new boolean[arr2[0].length][arr2.length];
for(int i = 0; i < newArr.length; i++){
for(int j = 0; j < newArr[0].length; j++){
newArr[i][j] = arr2[arr2.length - 1 - j][i];
}
}
arr2 = newArr;
}
static void input(BufferedReader br) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
N1 = Integer.parseInt(st.nextToken());
M1 = Integer.parseInt(st.nextToken());
arr1 = new boolean[N1][M1];
for (int i = 0; i < N1; i++) {
String line = br.readLine();
for (int j = 0; j < M1; j++) {
arr1[i][j] = line.charAt(j) == '1';
}
}
st = new StringTokenizer(br.readLine());
N2 = Integer.parseInt(st.nextToken());
M2 = Integer.parseInt(st.nextToken());
arr2 = new boolean[N2][M2];
for (int i = 0; i < N2; i++) {
String line = br.readLine();
for (int j = 0; j < M2; j++) {
arr2[i][j] = line.charAt(j) == '1';
}
}
}
}
728x90
'coding test > baekjoon' 카테고리의 다른 글
[baekjoon] 1495. 기타리스트 - dp 값 범위 보고 유추해보기 (0) | 2025.05.28 |
---|---|
[baekjoon] 21275 폰 호석만 - 진법 변환 (0) | 2025.05.23 |
[baekjoon] 20168 골목 대장 호석 - 기능성 (0) | 2025.05.22 |
[baekjoon] 9489 사촌 - 메모리 초과/NoSuchElement (1) | 2025.05.21 |