💬 문제
[코딩테스트 연습 - [1차] 프렌즈4블록](https://school.programmers.co.kr/learn/courses/30/lessons/17679)
💬 Idea
- board를 세로형 2차원 배열로 바꾼다.
- 지워지는 좌표를 (4블록)탐색해서 point에 넣어준다.
- removePoint에 값들이 들어있다면 해당 좌표를 “-”로 바꾸고, result에 개수를 더해준다.
- “-”로 표시된 블록(지워진 블록) 위에 있는 블록들을 내린다.
💬 풀이
func solution(_ m:Int, _ n:Int, _ board:[String])->Int{varboardArr:[[String]]=Array(repeating:Array(repeating:"", count: m), count: n)varresult=0varisBreak=Array(repeating:false, count: m)varpoint:Set<[Int]>=[]
// 세로형 2차원 배열로 바꾸기
foriin0...board.count -1{letk=Array(board.reversed()[i]).map({String($0)})forjin0...k.count -1{boardArr[j][i]=k[j]}}isBreak[0]=truewhile isBreak.contains(true){foriin0...m -2{varbreakArr=Array(repeating:false, count: n)forjin0...n -2{ifboardArr[j][i]==boardArr[j][i +1] && boardArr[j][i +1]==boardArr[j +1][i +1] && boardArr[j][i +1]==boardArr[j +1][i] && boardArr[j][i]!="" && boardArr[j][i].allSatisfy({ $0.isUppercase }){
point.insert([j, i])
point.insert([j, i +1])
point.insert([j +1, i +1])
point.insert([j +1, i])breakArr[j]=true}else{breakArr[j]=false}}if breakArr.contains(true){isBreak[i]=true}else{isBreak[i]=false}}
// point에 들어간 좌표들 "-"로 바꾸기
if !point.isEmpty {forkin point.sorted(by:{$0[0]<$1[0]}){boardArr[k[0]][k[1]]="-"}}
// "-"로 바꾼 부분 삭제하고 삭제된만큼 ""로 채우기
for(index, l)in boardArr.enumerated(){boardArr[index]= l.filter({ $0 !="-"})ifboardArr[index].count < m {for_in1...m - boardArr[index].count {boardArr[index].append("")}}}
result += point.count
point.removeAll()}return result
}print(solution(4,5,["CCBDE","AAADE","AAABF","CCBBF"]))print(solution(6,6,["TTTANT","RRFACC","RRRFCC","TRRRAA","TTMMMF","TMMTTJ"]))print(solution(6,6,["AABBEE","AAAEEE","VAAEEV","AABBEE","AACCEE","VVCCEE"]))print(solution(2,2,["aa","aa"]))
💬 문제[코딩테스트 연습 - [1차] 프렌즈4블록](https://school.programmers.co.kr/learn/courses/30/lessons/17679)
💬 Idea💬 풀이