πŸ“¦ hanliang38 / Coding_Test_Practice

πŸ“„ 3.2021.09.09.md Β· 117 lines
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117## λ¬Έμ œμ„€λͺ…

ν…Œμ΄λΈ” μœ„μ— 놓인 퍼즐 쑰각을 κ²Œμž„ λ³΄λ“œμ˜ 빈 곡간에 적절히 μ˜¬λ €λ†“μœΌλ € ν•©λ‹ˆλ‹€. κ²Œμž„ λ³΄λ“œμ™€ ν…Œμ΄λΈ”μ€ λͺ¨λ‘ 각 칸이 1x1 크기인 정사각 격자 λͺ¨μ–‘μž…λ‹ˆλ‹€. μ΄λ•Œ, λ‹€μŒ κ·œμΉ™μ— 따라 ν…Œμ΄λΈ” μœ„μ— 놓인 퍼즐 쑰각을 κ²Œμž„ λ³΄λ“œμ˜ λΉˆμΉΈμ— μ±„μš°λ©΄ λ©λ‹ˆλ‹€.

- 쑰각은 ν•œ λ²ˆμ— ν•˜λ‚˜μ”© μ±„μ›Œ λ„£μŠ΅λ‹ˆλ‹€.
- 쑰각을 νšŒμ „μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
- 쑰각을 뒀집을 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.
- κ²Œμž„ λ³΄λ“œμ— μƒˆλ‘œ μ±„μ›Œ 넣은 퍼즐 쑰각과 μΈμ ‘ν•œ 칸이 λΉ„μ–΄μžˆμœΌλ©΄ μ•ˆ λ©λ‹ˆλ‹€.

λ‹€μŒμ€ 퍼즐 쑰각을 μ±„μš°λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

![](https://images.velog.io/images/kk5448599/post/e890a6c6-b4f7-45ba-8929-09f253396036/image.png)

μœ„ κ·Έλ¦Όμ—μ„œ μ™Όμͺ½μ€ ν˜„μž¬ κ²Œμž„ λ³΄λ“œμ˜ μƒνƒœλ₯Ό, 였λ₯Έμͺ½μ€ ν…Œμ΄λΈ” μœ„μ— 놓인 퍼즐 쑰각듀을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. ν…Œμ΄λΈ” μœ„μ— 놓인 퍼즐 쑰각듀 λ˜ν•œ λ§ˆμ°¬κ°€μ§€λ‘œ [상,ν•˜,쒌,우]둜 인접해 λΆ™μ–΄μžˆλŠ” κ²½μš°λŠ” μ—†μœΌλ©°, 흰 칸은 퍼즐이 놓이지 μ•Šμ€ 빈 곡간을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. λͺ¨λ“  퍼즐 쑰각은 격자 칸에 λ”± 맞게 λ†“μ—¬μžˆμœΌλ©°, 격자 칸을 λ²—μ–΄λ‚˜κ±°λ‚˜, 걸쳐 μžˆλŠ” λ“± 잘λͺ» 놓인 κ²½μš°λŠ” μ—†μŠ΅λ‹ˆλ‹€.

μ΄λ•Œ, μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 3,4,5번 쑰각을 격자 칸에 λ†“μœΌλ©΄ κ·œμΉ™μ— μ–΄κΈ‹λ‚˜λ―€λ‘œ λΆˆκ°€λŠ₯ν•œ κ²½μš°μž…λ‹ˆλ‹€.

![](https://images.velog.io/images/kk5448599/post/09958df1-75e1-4b46-b0a3-812762bbe38b/image.png)

- 3번 쑰각을 놓고 4번 쑰각을 놓기 전에 μœ„μͺ½μœΌλ‘œ μΈμ ‘ν•œ 칸에 빈칸이 μƒκΉλ‹ˆλ‹€.
- 5번 쑰각의 μ–‘ μ˜†μœΌλ‘œ μΈμ ‘ν•œ 칸에 빈칸이 μƒκΉλ‹ˆλ‹€.

λ‹€μŒμ€ κ·œμΉ™μ— 맞게 μ΅œλŒ€ν•œ λ§Žμ€ 쑰각을 κ²Œμž„ λ³΄λ“œμ— μ±„μ›Œ 넣은 λͺ¨μŠ΅μž…λ‹ˆλ‹€.

![](https://images.velog.io/images/kk5448599/post/5ade932f-af7f-4d51-b31e-a7e32c18af7a/image.png)

μ΅œλŒ€ν•œ λ§Žμ€ 쑰각을 μ±„μ›Œ λ„£μœΌλ©΄ 총 14칸을 μ±„μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ κ²Œμž„ λ³΄λ“œμ˜ μƒνƒœ `game_board`, ν…Œμ΄λΈ” μœ„μ— 놓인 퍼즐 쑰각의 μƒνƒœ `table`이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. κ·œμΉ™μ— 맞게 μ΅œλŒ€ν•œ λ§Žμ€ 퍼즐 쑰각을 μ±„μ›Œ 넣을 경우, 총 λͺ‡ 칸을 μ±„μšΈ 수 μžˆλŠ”μ§€ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

<br><br>

## μ œν•œμ‚¬ν•­

> - 3 ≀ `game_board`의 ν–‰ 길이 ≀ 50
> - `game_board`의 각 μ—΄ 길이 = `game_board`의 ν–‰ 길이
>   - 즉, κ²Œμž„ λ³΄λ“œλŠ” 정사각 격자 λͺ¨μ–‘μž…λ‹ˆλ‹€.
>   - `game_board`의 λͺ¨λ“  μ›μ†ŒλŠ” 0 λ˜λŠ” 1μž…λ‹ˆλ‹€.
>   - 0은 빈칸, 1은 이미 μ±„μ›Œμ§„ 칸을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
>   - 퍼즐 쑰각이 놓일 λΉˆμΉΈμ€ 1 x 1 크기 μ •μ‚¬κ°ν˜•μ΄ μ΅œμ†Œ 1κ°œμ—μ„œ μ΅œλŒ€ 6κ°œκΉŒμ§€ μ—°κ²°λœ ν˜•νƒœλ‘œλ§Œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.
> - `table`의 ν–‰ 길이 = `game_board`의 ν–‰ 길이
> - `table`의 각 μ—΄ 길이 = `table`의 ν–‰ 길이
>   - 즉, ν…Œμ΄λΈ”μ€ `game_board`와 같은 크기의 정사각 격자 λͺ¨μ–‘μž…λ‹ˆλ‹€.
>   - `table`의 λͺ¨λ“  μ›μ†ŒλŠ” 0 λ˜λŠ” 1μž…λ‹ˆλ‹€.
>   - 0은 빈칸, 1은 쑰각이 놓인 칸을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
>   - 퍼즐 쑰각은 1 x 1 크기 μ •μ‚¬κ°ν˜•μ΄ μ΅œμ†Œ 1κ°œμ—μ„œ μ΅œλŒ€ 6κ°œκΉŒμ§€ μ—°κ²°λœ ν˜•νƒœλ‘œλ§Œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.
> - `game_board`μ—λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ 빈칸이 μžˆμŠ΅λ‹ˆλ‹€.
> - `table`μ—λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ 블둝이 놓여 μžˆμŠ΅λ‹ˆλ‹€.

<br>

---

<br>

## μž…μΆœλ ₯ 예

![](https://images.velog.io/images/kk5448599/post/38bbd8ba-455f-4fd6-94a0-3b09ea8f3902/image.png)

<br>

## μž…μΆœλ ₯ 예 μ„€λͺ…

> **μž…μΆœλ ₯ 예 #1**
> μž…λ ₯은 λ‹€μŒκ³Ό 같은 ν˜•νƒœμ΄λ©°, 문제의 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.
> ![](https://images.velog.io/images/kk5448599/post/fa4ed30e-633a-4c05-9608-711a114525ff/image.png)

> **μž…μΆœλ ₯ 예 #2**
> λΈ”λ‘μ˜ νšŒμ „μ€ κ°€λŠ₯ν•˜μ§€λ§Œ, 뒀집을 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

<br>

---

<br>

~~## 풀이~~

~~## solution.js~~

## 문제 탐색 & κ°œλ… 이해

- μ˜€λŠ˜μ€ 문제λ₯Ό ν’€κΈ°κ°€ μ–΄λ €μ›Œμ„œ 문제의 κ°œλ…κ³Ό μ‚¬μš©λ˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•΄ ν•œλ²ˆ μ •λ¦¬ν•˜λ©΄μ„œ μ΄ν•΄ν•˜λ €κ³  ν•œλ‹€.

> - 핡심 ν‚€μ›Œλ“œ
>   **κΉŠμ΄μš°μ„ νƒμƒ‰(DFS) & νšŒμ „λ³€ν™˜ν–‰λ ¬(Rotation matrix)**

- 각각의 ν‚€μ›Œλ“œμ— λŒ€ν•œ μžμ„Έν•œ κ°œλ…μ€ 정리 후에 ν¬μŠ€νŒ…ν•  생각이닀.

<br>

### 문제 탐색

λ¨Όμ € μ œν•œμ‚¬ν•­μ„ 보면 `game_board`와 `table`의 크기가 κ°™λ‹€λŠ” 것을 μ•Œ 수 있고,
`table`의 `block`은 `game_board`에 μ±„μ›Œ 넣을 λ•Œ μ„œλ‘œ μƒν•˜μ’Œμš°κ°€ μΈμ ‘ν•˜λ©΄ μ•ˆλœλ‹€.

1. μš°μ„  `game_board`λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λ―€λ‘œ `game_board`에 ν•΄λ‹Ήν•˜λŠ” 배열을 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. (μ΄ˆκΈ°μ—λŠ” 아무것도 μ—†μœΌλ―€λ‘œ 0을 빈 λ°°μ—΄μ˜ κ°’μœΌλ‘œ λ„£λŠ”λ‹€.)
2. `table`의 퍼즐 쑰각을 νšŒμ „ν•œ λ‚΄μš©κΉŒμ§€ μ•Œμ•„λ‚Έλ‹€.
3. `game_board`에 퍼즐이 λ“€μ–΄κ°€λŠ” λΆ€λΆ„κ³Ό λ“€μ–΄κ°€μ§€ μ•Šμ€ 뢀뢄을 ν™•μΈν•œλ‹€.

일단 문제λ₯Ό 보고 λ‚΄κ°€ μƒκ°ν•œ 것은 μ—¬κΈ°κΉŒμ§€μ΄λ‹€.

### κ°œλ… 이해

- κΉŠμ΄μš°μ„ νƒμƒ‰ (DFS)
  μƒν•˜μ’Œμš°μ˜ 칸듀이 λͺ¨λ‘ λΉ„μ–΄μžˆλŠ”μ§€ μ±„μ›Œμ‘ŒλŠ”μ§€ 순차적으둜 λͺ¨λ‘ ν™•μΈν•˜κ³  λΉ„μ–΄μžˆκ³  λ“€μ–΄κ°ˆ 수 μžˆλŠ” 퍼즐 쑰각을 λ°°μΉ˜ν•œλ‹€. κ·Έ ν›„ 같은 λ°©μ‹μœΌλ‘œ λ‹€μŒ 쑰각을 λΉ„κ΅ν•˜μ—¬ 배치, μ €μž₯ν•œλ‹€.
- νšŒμ „λ³€ν™˜ν–‰λ ¬ (Rotation matrix)
  퍼즐쑰각을 νšŒμ „ν•  수 μžˆμœΌλ―€λ‘œ νšŒμ „μ‹œ μ μš©λ˜λŠ” 행렬을 κ΅¬ν•˜κ³  λ°°μΉ˜ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.

<br>

## 배운 점 & λŠλ‚€ 점

- μ˜ˆμ „μ— μ½”λ“œμŠ€ν…Œμ΄μΈ μ—μ„œ ν–ˆλ˜ n-queens와 λΉ„μŠ·ν•œ λŠλ‚Œμ΄ 났닀.
- κ°‘μžκΈ° λ‚œμ΄λ„κ°€ μ˜¬λΌκ°„λ“―ν•΄μ„œ 많이 λ‹Ήν™©μŠ€λŸ¬μ› κ³  λ¬Έμ œν•΄μ„κ³Ό ν‘ΈλŠ”λ°μ— κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ κΈΈμ–΄μ‘Œλ‹€.
- νšŒμ „λ³€ν™˜ν–‰λ ¬μ€ μ„ ν˜•λ³€ν™˜μ˜ μ„±μ§ˆ 쀑 ν•˜λ‚˜λΌκ³  ν•œλ‹€. λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•˜μ—¬ 문제λ₯Ό λΉ λ₯΄κ²Œ ν’€κΈ° μœ„ν•΄μ„œλŠ” μ’€ 더 깊게 곡뢀할 ν•„μš”κ°€ μžˆλŠ” 것 κ°™λ‹€.