๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

[Swift] 2020 KAKAO BLIND RECRUITMENT ์ž๋ฌผ์‡ ์™€ ์—ด์‡ 

by Fomagran ๐Ÿ’ป 2021. 3. 1.
728x90
๋ฐ˜์‘ํ˜•

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]})

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€