Codeup 1097, 1098 review

calis_ws·2023년 5월 27일
0

바둑알 십자 뒤집기

https://codeup.kr/problem.php?id=1097

import java.util.Scanner;

public class Codeup1097_2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        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();
            }
        }

        int[][] arr2 = arr;

        int n = sc.nextInt();

        for (int j = 0; j < n; j++) {
            int x = sc.nextInt();
            int y = sc.nextInt();

            for (int i = 0; i < arr2.length; i++) {
                if (arr[x - 1][i] == 1) arr[x - 1][i] = 0;  // [10][0~18]
                else arr[x - 1][i] = 1;
            }
            for (int i = 0; i < arr2.length; i++) {
                if (arr[i][y - 1] == 1) arr[i][y - 1] = 0;  // [0~18][10]
                else arr[i][y - 1] = 1;
            }
        }

        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2.length; j++) {
                System.out.printf("%d ", arr2[i][j]);
            }
            System.out.println();
        }
    }
}

오랜만에 다시 풀어봤지만 상당한 시간이 걸렸다. 풀면서 이상했던 점은 x와 y의 위치가 반대로 나오는 것이였는데 위치만 바꾸니 통과했다.

설탕과자 뽑기

https://codeup.kr/problem.php?id=1098&rid=0

import java.util.Scanner;

public class Codeup1098 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int h = sc.nextInt();
        int w = sc.nextInt();
        int[][] arr = new int[h][w];

        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            int l = sc.nextInt();
            int d = sc.nextInt();
            int x = sc.nextInt();
            int y = sc.nextInt();

            for (int j = 0; j < l; j++) {
                if (d == 0) arr[x - 1][y - 1 + j] = 1;
            }
            for (int j = 0; j < l; j++) {
                if (d == 1) arr[x - 1 + j][y - 1] = 1;
            }
        }

        for (int i = 0; i < h; i++) {       
            for (int j = 0; j < w; j++) {
                System.out.printf("%d ", arr[i][j]);
            }
            System.out.println();
        }
    }
}

이 문제 3주 전에 도전했다가 실패했는데 드디어 오늘 풀 수 있었다. 저번에는 조건식에서 헤맸었는데 오늘도 그 때처럼 몇 시간을 헤매다가 깊은 명상을 통해 도출해낼 수 있었다.

그러나 문제는 출력에서 익셉션에러가 최종적인 흑막으로 남아있었다. 도저히 이 부분은 혼자 해결할 수 없어서 백엔드 위키를 찾아보았는데

// 수정 전 초기 코드
 Scanner sc = new Scanner(System.in);

        int[][] arr = new int[sc.nextInt()][sc.nextInt()];
        
     		...
        
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();
        }

첫 번째 문제점은 문제에서 요구하는 n * n 배열의 크기 n이 서로 같다는 말이 없었기 때문에 행과 열의 크기를 따로 지정했어야 했다.
h 와 열 w 를 생성

두 번째 문제점은 출력 반복문의 조건식이 i < h, j < w가 되어야 한다고 쓰여있었는데 왜 arr.length가 안되는지 모르겠어서 원기님께 여쭤보았다.

arr.length가 행의 개수를 의미한다는 것을 이제야 알았다...
지금껏 i에 넣으면 행이고 j에 넣으면 열의 개수인줄 알았거늘 기본적인 부분에서 놓치고 있었다.
간단한 질문에도 상세한 답변을 주신 원기님께 감사하다.

주말 간에 1097 ~ 1099 까지는 풀어오는게 회고팀의 숙제여서 오늘 풀어봤는데 하루종일 코딩해도 두 문제밖에 풀지 못했다. 푸는 동안 정말 난 돌대가리인가 하면서 현타에 빠졌었는데 그래도 해결을 하고 나니 한결 나아진 기분이다.
알고리즘은 풀 때마다 이걸 대체 왜 해야하나 하면서 꿍시렁 대긴 하지만 풀어내기만 하면 성장한 듯한 느낌이 드는게 좋은 것 같다. 앞으로 이걸 얼마나 반복해야 할까 해낼 수 있을까 걱정이 많다. 일단 오늘은 여기까지.

profile
반갑습니다람지

0개의 댓글