2025-10-13 학습 기록

랏 뜨·2025년 10월 13일

📑 세부 학습 내용


📅 스케쥴

  • 4시간 독서 + 궁금한 개념 조사 및 학습 + 2시간 코딩테스트 및 풀이 리뷰
  • 6시간

🧷 학습 시간 인증


📖 도서 정독 및 실습

실전 레디스 : 기초, 실전, 고급 단계별로 배우는 레디스 핵심 가이드

  • 캐싱 등 RDB 의 보조 역할을 해줄 NoSQL 중 가장 범용적이고 유지보수가 잘 진행 중인 Redis 의 구조부터 기초, 심화 내용, 사용법 등을 확실하게 이해하여, 이후의 프로그래밍에 있어 자신 있고 근거 있게 레디스를 채택하고 사용할 수 있는 개발자를 목표로 독서 시작
  • 2.7.3 Pub/Sub 기능 (p.147) ~ 2.7.6 자료형과 관계없이 사용 가능한 명령어 (p.203)
  • 도서 내 모든 내용 이해 및 실습 완료
    • 궁금한 부분은 따로 조사 후 학습

✏️ 코딩 테스트

⭕ 문제 풀이

class Solution {

    int n;
    int m;
    int kBoardSize;

    public boolean solution(int[][] key, int[][] lock) {
        m = key.length;
        n = lock.length;
        kBoardSize = n + 2 * (m - 1);
        int loopSize = kBoardSize - m;

        for (int i = 0; i < 4; i++) {
            key = rotate(key);

            for (int j = -m + 1; j <= loopSize; j++) {
                for (int k = -m + 1; k <= loopSize; k++) {
                    if (checkValid(key, lock, j, k)) {
                        return true;
                    }
                }
            }
        }

        return false;
    }

    private int[][] rotate(int[][] key) {
        int[][] rotatedKey = new int[m][m];

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < m; j++) {
                rotatedKey[i][j] = key[m - j - 1][i];
            }
        }

        return rotatedKey;
    }

    private boolean checkValid(int[][] key, int[][] lock, int row, int col) {
        int[][] newLock = new int[n][n];

        for (int i = 0; i < n; i++) {
            System.arraycopy(lock[i], 0, newLock[i], 0, n);
        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < m; j++) {
                int lockRow = row + i;
                int lockCol = col + j;

                if (lockRow >= 0 && lockRow < n && lockCol >= 0 && lockCol < n) {
                    newLock[lockRow][lockCol] += key[i][j];
                }
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (newLock[i][j] != 1) {
                    return false;
                }
            }
        }

        return true;
    }
}
  • 풀이 실패
    • 문제 이해 일부 실패 및 구현 방식을 떠올리지 못함
    • 어려운 부분은 풀이 도움 받아가며 구현
  • 브루트 포스 및 4중 반복문을 이용한 풀이
    • keylock 이 겹치는 부분이 존재할 때만 계산하면 됨
    • 따라서 N, M == 3 일 때 , lock[0, 0] 만 겹칠 때를 최소, lock[2, 2] 만 겹칠 때를 최대로 잡고 문제 풀이
  • key 의 크기를 그만큼 확장한 크기 계산
    • kBoardSize = n + 2 * (m - 1)
    • lock 의 처음만 겹칠 때와 끝만 겹칠 때 key 의 시작(처음) 위치
  • 4번 90도 회전
    • 회전 후 가능한 모든 key 의 위치를 기준으로 lock 과의 상호작용 연산
    • 반복 시 key 의 시작점은 -(m - 1)로 설정
      • 그래야 lock 인덱스 참조를 제대로 수행 가능
    • 두 요소 합이 1이 아닌 값이 하나라도 있으면 실패
  • 최종 시간복잡도 : O(N^4)
    • 4중 반복문 : O(N^4)
    • 보다 작거나 영향이 적은 연산들의 복잡도는 생략
    • 최종 시간복잡도 : O(N^4)

💡 어려웠던 것 || 알게 된 것


  • 금일은 없음
profile
기록

0개의 댓글