본문 바로가기
📖 Problem Solution/Programmers

[Swift] 2020 KAKAO BLIND RECRUITMENT 기둥과 보 설치하기

by Fomagran 💻 2021. 8. 13.
728x90
반응형

Problem

 

 

코딩테스트 연습 - 기둥과 보 설치

5 [[1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1],[5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1]] [[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]] 5 [[0,0,0,1],[2,0,0,1],[4,0,0,1],[0,1,1,1],[1,1,1,1],[2,1,1,1],[3,1,1,1],[2,0,0,0],[1,1,1,0],[2,2,0,1]] [[

programmers.co.kr


Solution

 

1. 기둥을 추가할 때 적합한지 확인한다.

 

바닥,기둥 위,보의 위일 경우 설치할 수 있습니다.

 

func checkRightPillars(x:Int,y:Int) -> Bool {
    //바닥,기둥 위,보의 왼쪽 위일 경우
    if y == 0 || pillars[x][y-1] || papers[x][y]{
        return true
    }
    //보의 오른쪽 위일 경우
    if x > 0 {
        if papers[x-1][y] {
            return true
        }
    }
    return false
}

 

2. 보를 추가할 때 적합한지 확인한다.

 

보의 왼쪽이나 오른쪽이 기둥 위일 경우나 양쪽에 보가 있는 경우 설치할 수 있습니다.

 

func checkRightPapers(x:Int,y:Int,n:Int) -> Bool {
    //보의 왼쪽이 기둥 위일 경우
    if pillars[x][y-1] {
        return true
    }
    if x < n {
        //보의 오른쪽이 기둥 위일 경우
        if pillars[x+1][y-1]{
            return true
        }
    }
    if x > 0 && x < n {
        //양쪽에 보가 있을 경우
        if papers[x-1][y] && papers[x+1][y]{
            return true
        }
    }
    return false
}

 

3. 기둥이나 보를 삭제한 후 모든 기둥과 보가 적합한지 확인한다.

 

기둥이나 보를 삭제한 후 모든 기둥과 보가 적합한지 확인하고 만약 하나라도 적합하지 않다면 다시 추가해줘 무효처리를 합니다.

 

func checkRightStructure(n:Int) -> Bool {
    for paper in paperLocation {
        if !checkRightPapers(x: paper.0, y: paper.1,n: n){
            return false
        }
    }
    for pillar in pillarLocation {
        if !checkRightPillars(x: pillar.0, y: pillar.1) {
            return false
        }
    }
    return true
}

 

4. 기둥과 보의 위치를 조건에 맞게 정렬 후 반환한다.

 

   let result = pillarLocation.map{[$0.0,$0.1,0]} + paperLocation.map{[$0.0,$0.1,1]}
    return result.sorted { $0[0] == $1[0] ? $0[1] == $1[1] ? $0[2] < $1[2] : $0[1] < $1[1] : $0[0] < $1[0]
    }

Source Code

 

728x90
반응형

댓글