[Swift] 백준 3085 - 사탕게임

sun02·2022년 1월 4일
0

알고리즘

목록 보기
33/52


문제 바로가기

이 문제는 가장 긴 행이나 열의 연속으로 된 사탕의 개수를 구하는 문제인데
인접한 사탕끼리 자리를 바꿀 수 있기 때문에

나는 사탕을 한번 바꿔줄 때마다 바뀐 배열의 가장 긴 행과 열의 연속으로 된 사탕의 개수를 구하도록 하였다.

예를 들어 N = 3일 때 다음과 같은 3X3의 배열이 있다고 하면

012
CPC
PCP
PPC
  • [0][0]과 [0][1]을 바꾼 배열
012
PCC
PCP
PPC

이 배열의 행의 연속으로 된 최대 개수는 2이고, 열의 연속으로 된 최대 개수는 3이다

  • [0][0]과 [1][0]을 바꾼 배열
012
PPC
CCP
PPC

이 배열의 행의 연속으로 된 최대 개수는 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)
  • readLine()으로 받은 문자열 "abcde"를 Array()안에 넣어주면 ["a","b","c","d","e"]가 된다.
  • swapAt(i,j)을 사용하서 간단하게 배열의 원소값을 교환할 수 있다.

0개의 댓글