이 문제는 가장 긴 행이나 열의 연속으로 된 사탕의 개수를 구하는 문제인데
인접한 사탕끼리 자리를 바꿀 수 있기 때문에
나는 사탕을 한번 바꿔줄 때마다 바뀐 배열의 가장 긴 행과 열의 연속으로 된 사탕의 개수를 구하도록 하였다.
예를 들어 N = 3일 때 다음과 같은 3X3의 배열이 있다고 하면
0 | 1 | 2 |
---|---|---|
C | P | C |
P | C | P |
P | P | C |
0 | 1 | 2 |
---|---|---|
P | C | C |
P | C | P |
P | P | C |
이 배열의 행의 연속으로 된 최대 개수는 2이고, 열의 연속으로 된 최대 개수는 3이다
0 | 1 | 2 |
---|---|---|
P | P | C |
C | C | P |
P | P | C |
이 배열의 행의 연속으로 된 최대 개수는 2이고, 열의 연속으로 된 최대 개수는 1이다.
이 과정을 for문을 사용해서 배열의 모든 원소에 대해서 반복해 주었다.
import Foundation
let N = Int(readLine()!)!
var nArray : [[character]] = Array(repeating: Array(repeating: "A", counting: 51), counting: 51)
var result = 0
for i in 0..<N {
nArray[i] = Array(readLine()!)
}
for i in 0..<N {
for j in 0..<N-1 {
nArray[i].swapAt(j,j+1)
horizontalCount()
verticalCount()
nArray[i].swapAt(j,j+1)
var temp = nArray[j][i]
nArray[j][i] = nArray[j+1][i]
nArray[j+1][i] = temp
horizontalCount()
verticalCount()
temp = nArray[j][i]
nArray[j][i] = nArray[j+1][i]
nArray[j+1][i] = temp
}
}
func horizontalCount() {
for i in 0..<N {
var count = 1
for j in 0..<N-1 {
if nArray[i][j] == nArray[i][j+1] {
count += 1
} else {
result = max(result, count)
count = 1
}
result = max(result,count
}
}
}
func verticalCount() {
for i in 0..<N {
var count = 1
for j in 0..<N-1 {
if nArray[j][i] == nArray[j+1][i] {
count += 1
} else {
result = max(result, count)
count = 1
}
result = max(result, count)
}
}
}
print(result)