https://codeup.kr/problem.php?id=1097
입력
바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다.
십자 뒤집기 횟수(n)가 입력된다.
십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다.
출력
십자 뒤집기 결과를 출력한다.
이번 문제는 정답코드를 보고 또 보다가 한 번 내 손으로 작성 해보고싶었다.
지금의 나에겐 길고 복잡한 이 코드를 백지 상태에서 도전하기가 어렵다고 판단되어 15팀의 백엔드 위키를 참고하여 재도전해보았다.
먼저 위키의 적힌 주석으로 각 단계를 적어놓았다.
출처 : 멋사 5기 백엔드 위키 15팀 1&&Only
이해한 로직의 설명을 되감아보며 코드 작성
// 1. 19 x 19 크기의 이차원 배열을 선언하고, 배열을 입력합니다.
int[][] arr = new int[19][19];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr[i][j] = sc.nextInt();
}
}
// 2. 입력한 (x, y) 좌표가 (10,10) 일 때 우선 x 좌표를 고정 시키고 y 좌표에 해당하는 값을 for문을 통해 반복하여 값이 0 이면 1로, 1이면 0으로 바꿔줍니다.
for (int i = 0; i < arr.length; i++) { // arr[9][0~18]
if (arr[9][19] == 0) {
arr[9][19] = 1;
} else {
arr[9][19] = 0;
}
}
// 3. 그 다음 y 좌표를 고정 시키고 x 좌표에 해당하는 값을 마찬가지로 for문을 통해 반복하여 0 과 1을 바꿔줍니다.
// ※ 이 때 위 두개의 for문 순서는 바뀌어도 상관없습니다.(x 좌표를 먼저 고정하나 y 좌표를 먼저 고정하나 결과값은 같음)
for (int i = 0; i < arr.length; i++) {
if (arr[19][9] == 0) {
arr[19][9] = 1;
} else {
arr[19][9] = 0;
}
}
// 4. 두번째로 입력받은 num 값으로 위 두개의 for 문을 묶어줍니다.
int num = sc.nextInt();
for (int i = 0; i < num; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
}
// 5. 십자 뒤집기를 한 배열을 출력해줍니다.
쭉 작성해보고 기억안나거나 막힐 때 까지 이어서 수정
import java.util.Scanner;
public class Codeup1097 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 1. 19 x 19 크기의 이차원 배열을 선언하고, 배열을 입력합니다.
int[][] arr = new int[19][19];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr[i][j] = sc.nextInt();
}
}
// 2. 입력한 (x, y) 좌표가 (10,10) 일 때 우선 x 좌표를 고정 시키고 y 좌표에 해당하는 값을 for문을 통해 반복하여 값이 0 이면 1로, 1이면 0으로 바꿔줍니다.
// 3. 그 다음 y 좌표를 고정 시키고 x 좌표에 해당하는 값을 마찬가지로 for문을 통해 반복하여 0 과 1을 바꿔줍니다.
// ※ 이 때 위 두개의 for문 순서는 바뀌어도 상관없습니다.(x 좌표를 먼저 고정하나 y 좌표를 먼저 고정하나 결과값은 같음)
// 4. 두번째로 입력받은 num 값으로 위 두개의 for 문을 묶어줍니다.
int num = sc.nextInt();
for (int i = 0; i < num; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
for (int j = 0; j < arr.length; j++) { // arr[9][0~18]
if (arr[x - 1][j] == 0) {
arr[x - 1][j] = 1;
} else {
arr[x - 1][j] = 0;
}
}
for (int j = 0; j < arr.length; j++) {
if (arr[j][y - 1] == 0) {
arr[j][y - 1] = 1;
} else {
arr[j][y - 1] = 0;
}
}
}
// 5. 십자 뒤집기를 한 배열을 출력해줍니다.
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
System.out.printf("%d ", arr[i][j]);
}
System.out.println();
}
}
}
신기하게 막힘없이 끝까지 코드를 작성 완료했다.. 뭐지? 이해한건가?
그래도 틀린게 있을 수 있으니 코드업에 제출을 해보았다.
헐
맞췄다 ㅋㅋㅋ
솔직히 자신없었는데 맞춘거 보고 매우 신기했다. 며칠 전만 해도 구글링해서 블로그에 답을 쭉 봤었는데도 이해가 어려웠다. 몇 시간을 2차원 배열에 끙끙 앓느라 스트레스 받았었는데 오늘 공부하고 풀리는게 아직도 신기하다.
아무래도 15팀 위키 덕분임에 틀림없다. 분명 혼자 머리 쥐어뜯은게 이해할 설명이 부족함 때문이었는데 15팀이 작성한 위키는 돌머리인 내가 봐도 이해하기가 쉬웠다. 연휴에 누구한테 질문할 수도 없는 상황에서 정말 한 줄기 빛과 같았다. 다시 한 번 작성해주신 15팀 고수분들께 감사함을 표한다. 정말 멋있는 사람들 같다.