Programming/Algorithm & Data Structure
[Swift] 프로그래머스 2021 카카오 채용연계형 인턴십 > 거리두기 확인하기
guswlsdk
2022. 8. 25. 11:48
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
<문제풀이>
places 행 길이 == 대기실의 수
places 열 길이 == 대기실 세로 길이
places 원소의 길이 == 대기실 가로의 길이
P == 응시자, O == 빈 테이블, X == 파티션
각 대기실 마다 2차원 배열로 표현하기
상하좌우 4방향
처음에 어렵게 접근 했던 것 같다. "P"위치를 발견하면 상하좌우 2칸 대각선 1칸씩에 P가 있는지 "탐색"하는 방법으로 문제를 해결하려고 했었다. (X를 만나면 continue.....)
그러나 이렇게 하면 8개의 방향(상하좌우, 네 방향 대각선)으로 인덱스를 처리해줘야 하기 때문에 변위를 이용해서 하기에도 애매했다. 더군다나 상하좌우는 2칸이기 때문에 더욱 더 까다로울 것 같았다.
레벨 2 문제가 맞나 의심될 정도로 어렵길래 구글링을 했는데 해법을 찾았다.
P를 기준으로 주변에 P가 있는지 확인하는 게 아니고, P를 기준으로 상하좌우 1칸 범위에 흔적만 표시하면 되는 것이다.
<코드>
func solution(_ places:[[String]]) -> [Int] {
func makeRoom(line: [String]){
func search(i: Int, j: Int) -> Int{
let dx = [-1,0,1,0]
let dy = [0,1,0,-1]
for index in 0..<dx.count{
let x = i+dx[index]
let y = j+dy[index]
if x > -1, x < 5, y > -1, y < 5{
if waitingRoom[x][y] == "P" || waitingRoom[x][y] == "OO"{
return 0
}else if waitingRoom[x][y] == "O"{
waitingRoom[x][y] = waitingRoom[x][y] + "O"
}
}
}
return 1
}
var waitingRoom = [[String]]()
for i in line{
waitingRoom.append(i.map{String($0)})
}
for i in 0..<waitingRoom.count{
for j in 0..<waitingRoom[i].count{
if waitingRoom[i][j] == "P"{
if search(i: i, j: j) == 0{
result.append(0)
return
}
}
}
}
result.append(1)
}
var result = [Int]()
for place in places{
makeRoom(line: place)
}
return result
}
반응형