Swift 공부: Programmers [1차] 프렌즈4블록 [level2] - 2018 KAKAO BLIND RECRUITMENT

syi07030·2022년 4월 11일
0

swift

목록 보기
4/4

문제 정보
https://programmers.co.kr/learn/courses/30/lessons/17679

이번 문제의 핵심은

  • 2차원 배열 다루기
  • 블록 재배치

요정도인 것 같다.

다음과 같은 순서로 코드를 작성해보았다.
1. 인자로 들어온 board를 2차원 배열인 arr로 바꾸기
2. 행, 열 탐색해서 지금 위치 기준으로 오른쪽, 아래, 대각선에 같은 문자들 있는지 탐색, 4개 모두 같으면 answerArr에 좌표값 넣기
3. answerArr 중복 없애기
4. answerArr에 해당되는 좌표들 모두 값 "0"으로 만들기
5. 2차원 배열 arr재배치
6. 더 이상 지울 수 있는 블럭이 없을 때까지 반복

이렇게 해서 최종 코드는

func solution(_ m:Int, _ n:Int, _ board:[String]) -> Int {
    var pre_answer = 0
    var answer = 0
    var answerArr = [[Int]]()
    var arr = Array(repeating:Array(repeating:"0",count:n),count:m)
    for (i,b) in board.enumerated(){
        arr[i] = b.map{String($0)}
    }

    repeat{
        pre_answer = answer
        //행,열 탐색해서 같은 거 있으면 answerArr에 좌표 넣기
        for i in stride(from:0,to:m-1,by:1){ //행
            for j in stride(from:0,to:n-1,by:1){ //열
                if arr[i][j] == "0" {continue}
                if arr[i][j] == arr[i+1][j] && arr[i][j] == arr[i][j+1] && arr[i][j] == arr[i+1][j+1]{
                    answerArr = answerArr + [[i,j]]+[[i+1,j]]+[[i,j+1]]+[[i+1,j+1]]
                }
            }
        }

        //answerArr 중복 없애기
        answerArr = Array(Set(answerArr))

        //answerArr에 있는 좌표 모두 0 만들기
        answer += answerArr.count
        for i in answerArr{
            arr[i[0]][i[1]] = "0"
        }

        //arr 배열 재배치
        for j in stride(from:0,to:n,by:1){ //열
            var first = 0 //블록이 내려와야할 행 위치
            if arr[m-1][j] == "0" {first = m-1}
            for i in stride(from:m-2,through:0,by:-1){ //행
                if arr[i][j] == "0"{
                    if i>first {first = i }
                }
                else if arr[i+1][j] == "0"{
                    arr[first][j] = arr[i][j]
                    arr[i][j] = "0"
                    first -= 1
                }
            }
        }
        //answerArr 다시 빈 배열 만들기
        answerArr = [[Int]]()
    } while(pre_answer<answer)
    return answer
}

으음,, 뭔가 기능들을 함수로 빼면 더 좋을 것 같은데
왜케 코드가 좀 지저분해보이지

아무튼 처음에 생각하지 못하고 빼먹었던 부분은 처음에 행, 열 탐색해서 같은 값들 있는 블럭 찾을 때
arr[i][j] == "0" 인 경우를 조건문에 넣지 않아서였다,, <- 이 조건문 꼭 포함하기!

또 하나는 테스트케이스 5, 10번이 계속 틀렸던 원인이었는데
바로 arr 배열 재배치에서 생각지 못했던 부분이 있었다.
예를 들어

위와 같은 상황에서 C는 아래에서 두 번째 자리로 내려와야 한다.
즉 바로 아래가 0인 경우 아래와 자리만 바꾸면 안 되고 실제로 블록이 내려와야할 위치를 또다른 변수인 first에 넣어 사용함으로써 배열 재배치를 제대로 할 수 있었다.

또다른 프로그래머스 문제들에 대한 풀이는 요기에🌱
https://github.com/syi07030/algorithm

피드백도 대환영🙆‍♀️

profile
잭과 근나물

0개의 댓글