간단한 문제 요약
N*N 크기의 상자에 사탕을 채워 놓는다. 사탕색이 모두 같지 않을 수 있다. 상자 안 사탕의 색이 다른 인접한 두 칸을 골라 서로 교환한다.
모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행, 열)을 고른 다음 그 사탕을 모두 먹을 때, 그 최대 개수를 구하시오.
문제 풀이, 했갈렸던 점
맨 처음에 문제를 읽으면서 사탕 안 색이 다른 인접한 두 칸을 골라 서로 교환하는데.. "언제까지 이걸 교환하지?"라는 생각에 문제의 의도와는 다른 방향으로 생각을 계속 했었습니다...
말 그대로 정말 심플하게 사탕안에 색이 다르면서 인접한 두 칸을 골라 서로 교환하면 됩니다. 그리고 나서 모든 행. 모든 열을 탐색 후 가장 긴 연속 부분을 찾으면 됩니다.
또 하나 문제를 풀면서, 열 우선 탐색을 할 때 collection에서 제공하는 swapAt를 사용했었는데 이는 잘못된 접근이었습니다. (x,y)와 (x,y+1)의 값을 바꿀 때는 직접 swap을 구현해야 합니다.
코드
func checkX() {
for y in 0..<n {
var cnt = 1
for x in 0..<n-1 {
if map[y][x] == map[y][x+1] { cnt += 1 }
else {
res = max(res,cnt)
cnt = 1
}
}
res = max(res,cnt)
}
}
func checkY() {
for x in 0..<n {
var cnt = 1
for y in 0..<n-1 {
if map[y][x] == map[y+1][x] { cnt += 1 }
else {
res = max(res,cnt)
cnt = 1
}
}
res = max(res,cnt)
}
}
var n = Int(readLine()!)!
var map = (0..<n).map {_ in readLine()!.map{ String($0) } }
var res = 0
for y in 0..<n {
for x in 0..<n-1 {
map[y].swapAt(x, x+1)
checkX();checkY();
map[y].swapAt(x, x+1)
}
}
for x in 0..<n {
for y in 0..<n-1 {
var temp = map[y][x]
map[y][x] = map[y+1][x]
map[y+1][x] = temp
checkX();checkY();
temp = map[y][x]
map[y][x] = map[y+1][x]
map[y+1][x] = temp
}
}
print(res)
'백준 PS일지 > BruteForce' 카테고리의 다른 글
[백준/Swift] 2475: 검증수 (0) | 2023.02.16 |
---|---|
[백준/Swift] 1025 : 제곱수 찾기 문제 뿌수기!! (0) | 2022.07.14 |
[백준/Swift] 2231 : 분해합 (0) | 2022.04.30 |
[백준/Swift] 1018 : 체스판 다시 칠하기 (0) | 2022.04.30 |