나의 기록, 현진록

[Swift] 프로그래머스 2021 카카오 채용연계형 인턴십 > 거리두기 확인하기 본문

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
}
반응형