Problem
์ฝ๋ฉํ ์คํธ ์ฐ์ต - ์๋ฌผ์ ์ ์ด์
[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true
programmers.co.kr
Solution
์๋ฌผ์ ์ ์ด์ ์ ๊ตฌ๋ฉ์ ๋น๊ตํ์ง ์๊ณ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋จผ์ ์ฒ๋ฆฌํด์ค๋๋ค.
1.์๋ฌผ์ ์ ๊ตฌ๋ฉ๊ณผ ์ด์ ์ ๋๊ธฐ๊ฐ ๊ฐ ๊ฐ 1๊ฐ์ผ ๊ฒฝ์ฐ True
2.์๋ฌผ์ ์ ๊ตฌ๋ฉ์ด ์ด์ ์ ๋๊ธฐ๋ณด๋ค ๋ง์ ๊ฒฝ์ฐ False
๋ง์ฝ 2๊ฐ์ ๊ฒฝ์ฐ ๋ชจ๋ ํด๋นํ์ง ์๋๋ค๋ฉด
์๋ฌผ์ ์ ์ด์ ์ ๊ฐ ๊ตฌ๋ฉ๊ณผ ๋๊ธฐ๊ฐ ์ด๋ ๋ถ๋ถ์ ์๋์ง๋ฅผ ์์๋ด์ผ ํ๋๋ฐ์.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์์๋ด์ผ ํ ๊น์?
์ ๋ ์๋์ ๊ฐ์ด ์๋ฌผ์ ์ ์ด์ ๋ฅผ X,Y ์ขํ๋ก ์๊ฐ์ ํด๋ณด์์ต๋๋ค.

์ง๋ฌธ์ ๋์ ์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ด์ ๋๊ธฐ๋ (0,1),(1,2),(2,2) ์ด๊ณ
์๋ฌผ์ ๊ตฌ๋ฉ์ (2,1),(1,2)๊ฐ ๋๊ฒ ์ฃ ?
(์ฝ๋๋ก ์์๋ด๋ ๋ฐฉ๋ฒ์ ์๋ ์์ค์ฝ๋์์ findSpinOrSlots ํจ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!)

์ด๋ ๊ฒ ์ด์ ์ ์๋ฌผ์ ๊ตฌ๋ฉ์ ์์๋๋ค๋ฉด
์ด์ ๋ฅผ ํ์ ํ์๋์ ๋๊ธฐ ์์น๋ฅผ ์ค์ ํด์ค์ผ ํฉ๋๋ค.
์๋๋ ์ฒ์ ์ด์ ์ ์์น๋ฅผ 0๋์ผ๋ ๊ธฐ์ค์ผ๋ก ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ๋๋ฆฌ๋ฉด ์์์ ์ฐ์ธก๊ทธ๋ฆผ์ด ๋๊ณ
์๊ณ๋ฐฉํฅ์ผ๋ก 180๋ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฌ๋ฉด ์๋์์ ์ข์ธก๊ทธ๋ฆผ , ์๊ณ๋ฐฉํฅ์ผ๋ก 270๋ ๋๋ฆฌ๋ฉด ์๋์์ ์ฐ์ธก ๊ทธ๋ฆผ์ ๋๋ค.




์ด๋ ๊ฒ ๋ณด๋ฉด ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ ๋๋ง๋ค ์๊ธฐ๋ ๊ท์น์ด ์๋๋ฐ์.
y์ ๊ฐ์ฅ ์ต๋๊ฐ์ ๋นผ์ค ๋ค ์ ๋๊ฐ์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ณ x์ y์ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด 0๋์ผ๋ ๊ฐ ๋๊ธฐ์ ์๋ (0,1), (1,2), (2,2) ์ ๋๋ค.
๋จผ์ ์ฒซ๋ฒ์งธ 0,1 ์ y์ ๊ฐ์ฅ ์ต๋๊ฐ์ด 2๋ฅผ ๋นผ์ค ๋ค ์ ๋๊ฐ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด -> 0,1
๊ทธ ๋ค์ x์ y์ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ๋ฉด -> 1,0
1,2๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์งํํ๋ฉด -> 0,1
2,2๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์งํํ๋ฉด -> 0,2
๋ก (1,0), (0,1), (0,2)๊ฐ ๋๊ณ ๋ณด๋ฉด ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ๋๋ฆฐ ์์์ ์ฐ์ธก ๊ทธ๋ฆผ์ ๋๊ธฐ ์์น๊ฐ ๋์์ฃ ?
์ด๋ฐ์์ผ๋ก ๊ฐ ํ์ ๋ฐฉํฅ์ ๋ฐ๋ฅธ ๋๊ธฐ์ ์์น๋ฅผ ์ ์ฅํด์ค๋๋ค.
(์๋ ์์ค์ฝ๋์์ rotate ํจ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
์ด๋ ๊ฒ ๋ชจ๋ ํ์ ๋ฐฉํฅ์ ๋๊ธฐ ์์น๋ฅผ ๊ตฌํ๋ค๋ฉด ๊ฐ ํ์ ๋ฐฉํฅ์ ๋ฐ๋ฅธ ๋๊ธฐ ์์น๊ฐ ์๋ฌผ์ ์ ๊ตฌ๋ฉ ์์น์ ์ผ์นํ๋์ง ํ์ธํด๋ด์ผ๊ฒ ์ฃ ?
๊ฐ์ฅ ๋จผ์ ์๋ฌผ์ ์ ์นธ์๋งํผ์ ์ด์ ๋๊ธฐ์์น์ x์ y์ ๊ฐ ๊ฐ ๋นผ์ค๋๋ค.
๊ทธ๋ผ ์ด๊ธฐ ์ธํ ์ ์๋์ ๊ฐ์ ์์น๊ฐ ๋ ๊ฒ์ ๋๋ค.

์ฌ๊ธฐ์๋ถํฐ๋ ๊ฐ y์ x์ +1์ ํด์ฃผ๋ฉด์ ์๋ฌผ์ ์ ๋น๊ตํด์ผํ๋๋ฐ์
์ด์ ๊ฐ M * M์นธ์ด๊ณ ์๋ฌผ์ ๊ฐ N*N์นธ์ด๋ผ๋ฉด ๊ฐ x์ y๊ฐ M+N์ -1 ๋งํผ์ ์ด๋ํด์ผ ๋ชจ๋ ์์น๋ฅผ ํ์ธํ ์ ์์ ๊ฒ์ ๋๋ค.
์๋์ GIF๋ฅผ ์ฐธ๊ณ ํด์ฃผ์๋ฉด ์ดํด๊ฐ ์ฌ์ฐ์ค๊ฑฐ์์!

์ด๋ ๊ฒ ๋ชจ๋ ํ์ ํ ์ด์ ์ ๋๊ธฐ์ ์์น์ ์๋ฌผ์ ์ ๊ตฌ๋ฉ์ ์์น๋ฅผ ๋น๊ตํด์ฃผ๋ค๊ฐ ๋ง์ฝ ์ผ์นํ๋๊ฒ ๋์ค๋ฉด
true๋ฅผ ๋ฐํํ๊ณ ์๋ค๋ฉด false๋ฅผ ๋ฐํํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
(์๋ ์์ค์ฝ๋์ moveAll ํจ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์)
์ฃผ์ํ์ค ์ ์ ๋ง์ฝ 2์ฐจ์ ๋ฐฐ์ด [[2,1],[1,2]]์ [[1,2],[2,1]]์ด ์๋ค๋ฉด ์ด๊ฒ์ ๊ฐ์ ๊ฒ์ผ๊น์?
์ ๋ต์ X์ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๊ฐ ์ด์ ์ ์์น๋ฅผ y ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด์ค๋ค x ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
(์๋ ์์ค์ฝ๋์ sortKeyspins์ ์ฐธ๊ณ ํด์ฃผ์ธ์.)
Source Code
import Foundation | |
var M = Int() | |
var N = Int() | |
func solution(_ key:[[Int]], _ lock:[[Int]]) -> Bool { | |
(M,N) = (key.count,lock.count) | |
if lock.filter({$0.contains(0)}).count == 1 && key.filter({$0.contains(1)}).count == 1{ | |
return true | |
} | |
if lock.filter({$0.contains(0)}).count > key.filter({$0.contains(1)}).count { | |
return false | |
} | |
let keySpins = findSlotOrSpins(keyOrLock: key,n:1) | |
let lockSlots = findSlotOrSpins(keyOrLock: lock,n:0) | |
var rotatedKeySpins = [keySpins] | |
for _ in 0...2 { | |
rotatedKeySpins.append(rotate(keySpins: rotatedKeySpins.last!)) | |
} | |
for keyspins in rotatedKeySpins { | |
var sortKeyspins = keyspins | |
sortKeyspins.sort(by: {$0[1] == $1[1] ? $0[0] < $1[0] : $0[1] < $1[1]}) | |
if moveAll(sortKeySpins: sortKeyspins, lockSlots: lockSlots) { | |
return true | |
} | |
} | |
return false | |
} | |
func findSlotOrSpins(keyOrLock:[[Int]],n:Int) -> [[Int]] { | |
var locations = [[Int]]() | |
for (y,location) in keyOrLock.enumerated() { | |
if location.contains(n){ | |
for (x,number) in location.enumerated() { | |
if number == n { | |
locations.append([x,y]) | |
} | |
} | |
} | |
} | |
return locations | |
} | |
func rotate(keySpins:[[Int]]) -> [[Int]] { | |
var rotatedKeySpins = [[Int]]() | |
for spin in keySpins { | |
let map = spin.map{String($0)} | |
let x = Int(map[0])! | |
let y = Int(map[1])! | |
rotatedKeySpins.append([y,abs(x-M+1)]) | |
} | |
return rotatedKeySpins | |
} | |
func moveAll(sortKeySpins:[[Int]],lockSlots:[[Int]]) -> Bool { | |
var start = sortKeySpins.map{[$0[0] - M,$0[1] - M]} | |
for _ in 1...N+M-1 { | |
start = start.map{[$0[0] + 1,$0[1]]} | |
if start.filter({0...N-1 ~= $0[0] && 0...N-1 ~= $0[1]}) == lockSlots { | |
return true | |
} | |
for _ in 1...N+M-1 { | |
start = start.map{[$0[0],$0[1] + 1]} | |
if start.filter({0...N-1 ~= $0[0] && 0...N-1 ~= $0[1]}) == lockSlots { | |
return true | |
} | |
} | |
start = start.map{[$0[0],$0[1] - (N+M-1)]} | |
} | |
return false | |
} |
์๋กญ๊ฒ ์๊ฒ๋ ๊ฒ
1์ฐจ์ ์ผ๋ก ์ ๋ ฌํ ๊ฒ์ ์ ์งํ ์ฑ ๋ ๋ค๋ฅธ ์กฐ๊ฑด์ผ๋ก ์ ๋ ฌํ๋ ๋ฒ
sort(by: {$0[1] == $1[1] ? $0[0] < $1[0] : $0[1] < $1[1]})
'๐ Problem Solution > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] 2021 KAKAO BLIND RECRUITMENT ์ ๊ท ์์ด๋ ์ถ์ฒ (3) | 2021.03.07 |
---|---|
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ๊ฐ์ฅ ๋จผ ๋ ธ๋ (์ฌ์ด ํ์ด ํฌํจ) (0) | 2021.03.07 |
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ์ฌ ์ฐ๊ฒฐํ๊ธฐ (5) | 2021.02.20 |
ํ๋ก๊ทธ๋๋จธ์ค N์ผ๋ก ํํ Swift (0) | 2021.02.07 |
ํ๋ก๊ทธ๋๋จธ์ค ๋ ๊ฐ ๋ฝ์์ ๋ํ๊ธฐ Swift (0) | 2021.01.23 |
๋๊ธ