코테/프로그래머스

[프로그래머스/Level3] 자물쇠와 열쇠 (JAVA)

imname1am 2024. 8. 27. 14:48
반응형

📖 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

💡  풀이 방식

• 브루트포스 (구현)

1. lock의 범위를 확장하고, 확장한 배열에  lock에 대한 정보를 입력한다.

  - Why? 키의 일부가 자물쇠 영역을 벗어나더라도, 키로 자물쇠를 열 수 있으면 정답이 되기 때문.

  - 그러므로 lock과 key가 겹칠 수 있는 모든 경우를 계산할 수 있을만큼 확장해야 한다.

  - 🔔 key의 크기와 lock의 크기가 항상 같진 않다!

 

  - 열쇠 이동거리 = 열쇠와 자물쇠가 처음 겹치는 부분 + 자물쇠의 크기

     ⇒ 확장한 배열 : 자물쇠 크기 + (열쇠 크기 -1) * 2

 

2. key를 시계 방향으로 총 4번 회전한다.

  - 회전하지 않은 경우, key 값을 그대로 newLock에 더한다. (∵ 자물쇠 0 + 홈 1 = 딱 맞음 1)

  - 90도 회전한 경우,   newLock[x + i][y + j] += key[j][len - i - 1];

  - 180도 회전한 경우, newLock[x + i][y + j] += key[len - i - 1][len- j - 1];

  - 270도 회전한 경우, newLock[x + i][y + j] += key[len - j - 1][i];

 

 

3. 회전한 key와 확장된 lock이 맞는지 확인한다.

  - newLock의 자물쇠 부분이 모두 1인지 확인하면 된다.

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Solution {
    public boolean solution(int[][] key, int[][] lock) {
        
        // 1. lock을 확장한다.
        int point = key.length - 1;
        
        for(int x = 0 ; x < point + lock.length ; x++) {
            for(int y = 0 ; y < point + lock.length ; y++) {
                
                // 2. key를 시계 방향으로 회전하기
                for(int d = 0 ; d < 4 ; d++) {
                    
                    // newLock : 확장한 lock 배열
                    int[][] newLock = new int[lock.length + key.length * 2][lock.length + key.length * 2];
                    
                    // newLock에 lock에 대한 정보 입력하기
                    for(int i = 0 ; i < lock.length ; i++) {
                        for(int j = 0 ; j < lock.length ; j++)
                            newLock[i+point][j+point] = lock[i][j]; // 확장할 lock 배열 초기화
                    }
                    
                    // newLock 배열에 key 배열 더하기
                    match(newLock, key, d, x, y);
                    
                    // 3. key와 lock이 맞는지 확인하기
                    if(chk(newLock, point, lock.length))
                        return true;
                }
            }
        }
        
        return false;
    }
    
    public void match(int[][] newLock, int[][] key, int rot, int x, int y) {
        int len = key.length;
        
        for(int i = 0 ; i < len ; i++) {
            for(int j = 0 ; j < len ; j++) {
                if(rot == 0)        // 1) 회전하지 않은 경우, 그대로 newLock에 더하기
                    newLock[x+i][y+j] += key[i][j];
                else if(rot == 1)   // 2) 시계 방향으로 90도 회전한 경우
                    newLock[x+i][y+j] += key[j][len-i-1];
                else if(rot == 2)   // 3) 시계 방향으로 180도 회전한 경우
                    newLock[x+i][y+j] += key[len-i-1][len-j-1];
                else                // 4) 시계 방향으로 270도 회전한 경우 == 반시계 방향으로 90도 회전한 경우
                    newLock[x+i][y+j] += key[len-j-1][i];
            }
        }
    }
    
    public boolean chk(int[][] newLock, int point, int len) {
        for(int i = 0 ; i < len ; i++) {
            for(int j = 0 ; j < len ; j++) {
                if(newLock[point + i][point + j] != 1)
                    return false;
            }
        }
        return true;
    }
}
cs

 

 

➕ 다른 풀이 방식

 

 

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

코딩테스트 연습 - 자물쇠와 열쇠 | 프로그래머스 (programmers.co.kr) 코딩테스트 연습 - 자물쇠와 열쇠 [[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true programmers.co.kr 어떻게 생각하고 문제를

haeng-on.tistory.com


💦 어려웠던 점

- 해결 아이디어를 생각하는 것이 어려웠다.. 뭔가 숫자 범위가 작아서 브루트포스라는 감은 잡았는데 그 이후는 감감무소식,,,

 

 

🧐 새로 알게 된 내용

- 배열을 확장해서 조건과 일치하는지 일일이 확인하는 아이디어

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 최고의 설명..

 

[프로그래머스]자물쇠와 열쇠 - JAVA

[프로그래머스]자물쇠와 열쇠 programmers.co.kr/learn/courses/30/lessons/60059 코딩테스트 연습 - 자물쇠와 열쇠 [[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true programmers.co.kr 풀이 특별한 알고리즘

moonsbeen.tistory.com

 

반응형