728x90
반응형
2024.07.24기준 - 실버1
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 입력된 2개의 행렬을 3x3 범위를 몇 번 반전을 하면 동일해지는지를 확인하고 몇 번 반전을 했는지를 출력하는 문제입니다.
1. 저장하는 행렬을 2개로 나뉘어 하나는 위에서 아래로, 다른 하나는 아래에서 위로 변환 시키기 위한 행렬을 생성했습니다.
oned = new char[h][w]; // 왼쪽 위부터 오른쪽 아래까지
oneu = new char[h][w]; // 오른쪽 아래부터 왼쪽 위까지
two = new char[h][w]; // 결과 맵
2. 3x3의 범위를 반전 시키는 함수를 생성했습니다.
// du = 1이면 위에서 아래로, du = 2면 아래에서 위로 3 x 3을 변환해주는 함수.
private static void change(int y, int x, int du) {
if (du == 1) {
for (int i = y; i < y + 3; i++) {
for (int j = x; j < x + 3; j++) {
if (oned[i][j] == '0') {
oned[i][j] = '1';
} else {
oned[i][j] = '0';
}
}
}
} else {
for (int i = y; i < y + 3; i++) {
for (int j = x; j < x + 3; j++) {
if (oneu[i][j] == '0') {
oneu[i][j] = '1';
} else {
oneu[i][j] = '0';
}
}
}
}
}
파라미터 du가 1이면 위에서 아래로, 2이면 아래에서 위로 가는 행렬을 변환시켜 주었습니다.
3. 내려가는 행렬 중 3x3에서 (0,0) 좌표가 일치하지 않다면 3x3의 범위를 전부 반전 시켜주었습니다.
// 위에서 아래로
for (int i = 0; i <= h - 3; i++) {
for (int j = 0; j <= w - 3; j++) {
if (oned[i][j] != two[i][j]) {
change(i, j, 1);
down++;
}
}
}
4. 올라가는 행렬 중 3x3에서 (2, 0)의 좌표가 일치하지 않다면 3x3의 범위를 전부 반전 시켜주었습니다.
// 아래에서 위로
for (int i = h - 3; i >= 0; i--) {
for (int j = w - 3; j >= 0; j--) {
change(i, j, 2);
up++;
}
}
5. 반전시킨 행렬을 결과 행렬과 일치하는지 확인하기 위해 체크하는 함수를 생성했습니다.
// du = 1이면 위에서 아래로, du = 2면 아래에서 위로 결과 맵이랑 동일한지 확인하는 함수.
private static boolean check(int du) {
boolean ch = true;
if (du == 1) {
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (oned[i][j] != two[i][j]) {
ch = false;
break;
}
}
if (!ch) {
break;
}
}
} else {
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (oneu[i][j] != two[i][j]) {
ch = false;
break;
}
}
if (!ch) {
break;
}
}
}
return ch;
}
동일하게 파라미터 du가 1이면 위에서 아래, 2이면 아래에서 위로 가는 행렬을 체크해 주었습니다.
6. 그렇게 반전시킨 2개의 행렬과 결과 행렬을 서로 비교를 하여 조건문을 통해 답을 출력해 주었습니다.
int count = 0;
if (!check(1) && check(2)) { // 아래에서 위로 변경 시 일치하면
count = up;
} else if (check(1) && !check(2)) { // 위에서 아래로 변경 시 일치하면
count = down;
} else if (check(1) && check(2)) { // 둘 다 일치하면
count = Math.min(up, down);
} else { // 둘 다 일치하지 않으면
count = -1;
}
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
static int h, w;
static char[][] oned, oneu, two;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
h = Integer.parseInt(st.nextToken()); // 행
w = Integer.parseInt(st.nextToken()); // 열
oned = new char[h][w]; // 왼쪽 위부터 오른쪽 아래까지
oneu = new char[h][w]; // 오른쪽 아래부터 왼쪽 위까지
two = new char[h][w]; // 결과 맵
char[] arr;
for (int i = 0; i < h; i++) {
arr = br.readLine().toCharArray();
for (int j = 0; j < w; j++) {
oned[i][j] = arr[j];
oneu[i][j] = arr[j];
}
}
for (int i = 0; i < h; i++) {
arr = br.readLine().toCharArray();
for (int j = 0; j < w; j++) {
two[i][j] = arr[j];
}
}
int down = 0;
int up = 0;
// 위에서 아래로
for (int i = 0; i <= h - 3; i++) {
for (int j = 0; j <= w - 3; j++) {
if (oned[i][j] != two[i][j]) {
change(i, j, 1);
down++;
}
}
}
// 아래에서 위로
for (int i = h - 3; i >= 0; i--) {
for (int j = w - 3; j >= 0; j--) {
change(i, j, 2);
up++;
}
}
int count = 0;
if (!check(1) && check(2)) { // 아래에서 위로 변경 시 일치하면
count = up;
} else if (check(1) && !check(2)) { // 위에서 아래로 변경 시 일치하면
count = down;
} else if (check(1) && check(2)) { // 둘 다 일치하면
count = Math.min(up, down);
} else { // 둘 다 일치하지 않으면
count = -1;
}
bw.write(Integer.toString(count));
bw.flush();
bw.close();
br.close();
}
// du = 1이면 위에서 아래로, du = 2면 아래에서 위로 3 x 3을 변환해주는 함수.
private static void change(int y, int x, int du) {
if (du == 1) {
for (int i = y; i < y + 3; i++) {
for (int j = x; j < x + 3; j++) {
if (oned[i][j] == '0') {
oned[i][j] = '1';
} else {
oned[i][j] = '0';
}
}
}
} else {
for (int i = y; i < y + 3; i++) {
for (int j = x; j < x + 3; j++) {
if (oneu[i][j] == '0') {
oneu[i][j] = '1';
} else {
oneu[i][j] = '0';
}
}
}
}
}
// du = 1이면 위에서 아래로, du = 2면 아래에서 위로 결과 맵이랑 동일한지 확인하는 함수.
private static boolean check(int du) {
boolean ch = true;
if (du == 1) {
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (oned[i][j] != two[i][j]) {
ch = false;
break;
}
}
if (!ch) {
break;
}
}
} else {
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (oneu[i][j] != two[i][j]) {
ch = false;
break;
}
}
if (!ch) {
break;
}
}
}
return ch;
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 32068번 보물 찾기 (0) | 2024.07.25 |
---|---|
BAEKJOON / 백준 - JAVA 1105번 팔 (0) | 2024.07.25 |
BAEKJOON / 백준 - JAVA 1058번 친구 (3) | 2024.07.23 |
정보처리산업기사 - 테스트 및 배포 - 결함 관리 (0) | 2024.07.23 |
BAEKJOON / 백준 - JAVA 30804번 과일 탕후루 (0) | 2024.07.22 |