Algorithm Problem Solving/Programmers

[프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차] 프렌즈4블록 with Swift

코코자장자장 2022. 1. 27. 12:34

안녕하세요. 오늘은 프로그래머스 프렌즈4블록 문제를 풀어보겠습니다.

 

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

 

이 문제는 구현 문제입니다.

 

제약조건에 의하여 문제에서 주어진 대로 풀어도 시간초과가 나지 않습니다.

 

있는 그대로 구현 해보도록 하겠습니다.

 

첫번째로 우선 지워질 블록을 선택합니다. 또, 지워질 블록이 없다면 탈출하는 조건도 만들어줍니다!

var canExit = true
for i in 0..<m-1 {
    for j in 0..<n-1 {
        let currentCharacter = arrayBoard[i][j]
        if arrayBoard[i][j] == " " {
            continue
        }
        if arrayBoard[i  ][j+1] == currentCharacter &&
           arrayBoard[i+1][j  ] == currentCharacter &&
           arrayBoard[i+1][j+1] == currentCharacter {
            isDeleted[i  ][j  ] = 1
            isDeleted[i+1][j  ] = 1
            isDeleted[i  ][j+1] = 1
            isDeleted[i+1][j+1] = 1
            canExit = false
        }
    }
}
if canExit {
    break
}
for i in 0..<m {
    print(isDeleted[i])
}

 

두번째로 블록을 지워주고 블록을 아래로 정렬해줍니다.

// 블록 삭제
for i in 0..<m {
    for j in 0..<n {
        if isDeleted[i][j] == 1 {
            arrayBoard[i][j] = " "
        }
    }
}
// 블록 드랍
for _ in 0..<m {
    for i in 0..<m-1 {
        for j in 0..<n {
            if arrayBoard[i+1][j] == " " {
                arrayBoard[i+1][j] = arrayBoard[i][j]
                arrayBoard[i][j] = " "
            }
        }
    }
}

 

이걸 반복해주고 탈출 후에 없어진 블록의 갯수를 카운트해주면 문제가 해결됩니다.

import Foundation

var isDeleted:[[Int]] = [[Int]]()

func solution(_ m:Int, _ n:Int, _ board:[String]) -> Int {
    
    var arrayBoard:[[Character]] = [[Character]]()
    for i in board {
        arrayBoard.append(Array(i))
    }
    
    var answer = 0
    
    while true {
        isDeleted = [[Int]](repeating: [Int](repeating: 0, count: n), count: m)
        // 지워질 블록 선택  & 탈출 조건
        var canExit = true
        for i in 0..<m-1 {
            for j in 0..<n-1 {
                let currentCharacter = arrayBoard[i][j]
                if arrayBoard[i][j] == " " {
                    continue
                }
                if arrayBoard[i  ][j+1] == currentCharacter &&
                   arrayBoard[i+1][j  ] == currentCharacter &&
                   arrayBoard[i+1][j+1] == currentCharacter {
                    isDeleted[i  ][j  ] = 1
                    isDeleted[i+1][j  ] = 1
                    isDeleted[i  ][j+1] = 1
                    isDeleted[i+1][j+1] = 1
                    canExit = false
                }
            }
        }
        if canExit {
            break
        }
        
        // 블록 삭제
        for i in 0..<m {
            for j in 0..<n {
                if isDeleted[i][j] == 1 {
                    arrayBoard[i][j] = " "
                }
            }
        }
        // 블록 드랍
        for _ in 0..<m-1 {
            for i in 0..<m-1 {
                for j in 0..<n {
                    if arrayBoard[i+1][j] == " " {
                        arrayBoard[i+1][j] = arrayBoard[i][j]
                        arrayBoard[i][j] = " "
                    }
                }
            }
        }
    }
    for i in 0..<m {
        for j in 0..<n {
            if arrayBoard[i][j] == " " {
                answer += 1
            }
        }
    }
    
    return answer
}

 

오늘은 여기까지이며, 질문이 있으시면 댓글로 남겨주세요!

 

좋은 하루 되세요😍