5,10번에서 막힘
전 - 같은 열에 있는 문자의 행을 위,아래 교환하여 풀었음
후 - 하위 행에서 상위행으로 탐색하도록 순서를 변경 하였고, 비어있을 경우 하위행에서 비어있지 않은 가장 가까운 행의 값으로 변경하고 그자리는 비워두도록 하였다.
이유: 2x2일 경우 한번에 지우고 비어 있는 가장 낮은 곳으로 한번에 자리해야함
1. board의 요소를 한 문자씩 나누어 가지도록 함
이유 -> 게임판처럼 만들기 위함??
boardArray 문자열 2차원 배열에 매핑하였음
2. boardArray의 2x2의 문자가 모두 같으면 setCordi에 추가하도록함
이유: 겹쳐져서 없어져야 될 수도 있기 때문에 set을 이용함
3. setCordi에 들어간 값들은 없어져야 할 값들이기 때문에 boardArray에 위치한 값을 "0"으로 바꾸도록함
지워질 값들을 구하는게 목표기 때문에 count에 +1을함
4. stride메서드를 이용해 가장 하위(값이 높은)행부터 읽어드리도록함
"0"이라면 같은 열에서 상향식으로 차근차근 보았을 때 "0"이 아닌 값을 가져오도록함
5.while true문을 이용해 무한반복하였고 setCordi에 값이 없으면 지워질게 없는 것이니 return하도록 하였다.
import Foundation
func solution(_ m:Int, _ n:Int, _ board:[String]) -> Int {
var boardArray: [[String]] = [[String]]()
var count = 0
for ele in board{
boardArray.append(ele.map{String($0)})
}
while true{
var setCordi = Set<[Int]>()
for i in 0..<m-1{ //행의 개수
for j in 0..<n-1{ //열의 개수
if boardArray[i][j] != "0" && boardArray[i][j] == boardArray[i][j+1] && boardArray[i+1][j] == boardArray[i+1][j+1] && boardArray[i][j] == boardArray[i+1][j+1]{ //1번
setCordi.insert([i,j])
setCordi.insert([i,j+1])
setCordi.insert([i+1,j])
setCordi.insert([i+1,j+1])
}
}
}
if setCordi.isEmpty{
return count
}
for i in setCordi{
boardArray[i[0]][i[1]] = "0"
count += 1
}
for i in stride(from: m-1, to: 0, by: -1){
for j in 0..<n{
if boardArray[i][j] == "0"{
for p in stride(from: i, through: 0, by: -1){
if boardArray[p][j] != "0" && boardArray[i][j] == "0"{
boardArray[i][j] = boardArray[p][j]
boardArray[p][j] = "0"
}
}
}
}
}
}
return count
}
'Swift랑 친해지기 > programmers 풀기' 카테고리의 다른 글
[프로그래머스] 연속 부분 수열 합의 개수 (Swift) ※10,20번 시간초과 해결 (0) | 2023.05.30 |
---|---|
[프로그래머스] Summer/Winter Coding(~2018) 방문 길이 (Swift) (2) | 2023.05.26 |
[프로그래머스] 공원 산책 (Swift) (0) | 2023.05.22 |
[프로그래머스] 추억 점수 (Swift) (0) | 2023.04.25 |
[프로그래머스] 달리기 경주 (Swift) <11,12,13 시간초과> (0) | 2023.04.23 |