(프로그래머스) 자물쇠와 열쇠

2021. 11. 24. 19:03·알고리즘/프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/60059

 

🐢 설명

자물쇠와 열쇠가 있고 열쇠를 좌우상하 움직여보고 90도씩 돌려보면서 겹치는 부분만 딱 들어 맞는다면 열린다고 판정하고 그외의 경우는 아니라고 해야하는 문제이다. 이때 자물쇠와 열쇠의 크기가 다를 수 있음에 유의하자.

 

다음과 같은 그림을 보면서 이해해보자.

Lock을 Key가 움직이면서 비교하기 위한 좌표 공간을 먼저 만들어준다. 이 공간은 원점을 기준으로 (key길이 - 1, key길이 - 1) 부터 (lock길이, lock길이)까지의 정사각형의 좌표평면을 갖게 된다.

이후 차례대로 모든 좌표에 대해서 확인을 해준다. 각 좌표에서 키를 둬보고 key 크기만큼 비교를 한다. 이때 좌표명면의 좌표값이 음수가 되거나 lock을 벗어난다면 이는 겹치지 않는 부분이므로 무시해줘야 한다.

따라서, 겹치는 부분에 대해서만 lock은 0이고, key가 1이라면  겹치는 부분에 해당하는 임시 배열을 만들어서 1을 체크해준다. 이때 lock과 key의 값이 같다면 매칭이 안되므로 false처리한다.

이후 겹치는 부분에 대해 모든 비교가 끝나면 해당 임시 배열과 , lock을 비교해서 둘다 0인 곳이 있다면 false를 처리한다. 이 경우는 겹치는 부분에 대해서는 들어 맞았지만 전체 lock이 들어 맞지는 않았다는 것이다. 이 외의 경우 매칭이 잘 된것이므로 true를 반환한다.

🐢코드
class Solution {
    static int[][] K;
    static int[][] L;
    static int klen;
    static int llen;
    static boolean ok;
    
    public boolean solution(int[][] key, int[][] lock) {
        
        K = key;
        L = lock;
        klen = K.length;
        llen = L.length;
        
        for (int d = 0; d < 4; d++) {
            if (match()) return true;
            else K = turn();
        }
        return false;
    }
    
    private static boolean match() {
        
        for (int y = 0 - klen + 1; y < llen; y++) {
            for (int x = 0 - klen + 1; x < llen; x++) {
                ok = true;
                
                // 겹치는 부분에 대한 임시 배열 공간
                int[][] tmp = new int[20][20];
                loop: for (int i = 0; i < klen; i++) {
                    for (int j = 0; j < klen; j++) {
                        int ny = y + i;
                        int nx = x + j;
                        
                        if (ny < 0 || ny >= llen || nx < 0 || nx >= llen) continue;
                        if (L[ny][nx] == K[i][j]) {
                            ok = false;
                            break loop;
                        }
                        // 겹치는 부분에 대해 맞물리는 곳을 체크함
                        if (L[ny][nx] == 0 && K[i][j] == 1) tmp[ny][nx] = 1;
                    }
                }
                
                // 겹치는 공간 배열과 자물쇠를 비교해서 다 들어맞는지 확인한다.
                // 아닌게 있다면 겹치는 부분에 자물쇠의 일부분만 맞물린 것이다.
                for (int i = 0; i < llen; i++) {
                    for (int j = 0; j < llen; j++) {
                        if (L[i][j] == 0 && tmp[i][j] == 0) {
                            ok = false;
                            break;
                        }
                    }
                }
                
                if (ok) return true;
            }
        }
        return false;
    }
    
    private static int[][] turn() {
        int[][] tmpK = new int[klen][klen];
        
        for (int i = 0; i < klen; i++) {
            for (int j = 0; j < klen; j++) {
                tmpK[j][klen - i - 1] = K[i][j];
            }
        }
        
        return tmpK;
    }
}
🐢 마무리
반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > 프로그래머스' 카테고리의 다른 글

(프로그래머스) 리틀 프렌즈 사천성  (0) 2021.11.22
(프로그래머스) 없어진 기록 찾기  (0) 2021.10.14
(프로그래머스) 헤비 유저가 소유한 장소 (dev-matching 상반기)  (0) 2021.10.14
(프로그래머스) 다단계 칫솔 판매 (dev-matching 상반기)  (0) 2021.10.14
(프로그래머스) 행렬 테두리 회전하기 (dev-matching 상반기)  (0) 2021.10.14
'알고리즘/프로그래머스' 카테고리의 다른 글
  • (프로그래머스) 리틀 프렌즈 사천성
  • (프로그래머스) 없어진 기록 찾기
  • (프로그래머스) 헤비 유저가 소유한 장소 (dev-matching 상반기)
  • (프로그래머스) 다단계 칫솔 판매 (dev-matching 상반기)
구름뭉치
구름뭉치
구름의 개발일기장
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (283)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (28)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (6)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    부다페스트
    마우스 패드
    동유럽
    레이저
    크로아티아
    mx master s3 for mac
    류블라냐
    마우스
    키보드 손목 받침대
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
(프로그래머스) 자물쇠와 열쇠
상단으로

티스토리툴바