본문 바로가기

백준 PS일지/BruteForce

[백준/Swift] 사탕 게임: 3085 | PS일지

 

문제

간단한 문제 요약

  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)