본문 바로가기
Algorithm/문제풀이_백준

[Swift][BruteForce] 백준 3085번 (사탕게임)

by Joahnee 2021. 9. 9.

요구능력 : 찐노가다

 

코드설명 : 

 

전체적인 코드 설계는 아래와 같다.

 

(조건 : 현재 i 인덱스 에서 다음번 인덱스의 사탕이 현재와 같은지)

1. 가로바꾸기

2. 가로, 세로 중에 사탕의 최대개수 구하기

3. 가로되돌려놓기

 

(조건 : 현재 i 인덱스 에서 다음번 인덱스의 사탕이 현재와 같은지)

1. 세로바꾸기

2. 가로, 세로 중에 사탕의 최대개수 구하기

3. 세로되돌려놓기

 

이해가 안가는 부분이 있으신분은 댓글 적어주시면 아는대로 답변드리겠습니다. 

 

후기 : 세상에.. 이 문제를 진짜 어렵게 풀었다.. 설계의 중요성을 다시금 깨닫는다.

풀때는 이게 대체 왜 실버4인가 싶었는데 풀고나니까 그냥 개념적용하는거 1개도없이 노가다로만 풀 수 있어서 실버4구나 싶다.

예제에 있는 부분은 다맞는데 계속 5%~6%에서 틀렸다고 나왔다.

잘못된 부분 경험을 얘기해보면

 

1. 세로바꾸는 부분을 잘못했다.

세로를 바꿧어야 했는데 가로를 바꿔버렸다.

근데 문제에있는 예제출력은 다맞았다. 그러니 못찾지..

세로바꾸는 부분이 잘못됫다는걸 인지한 반례가 있다.

 

3

CPZ

PCP

ZZC

답: 3

 

2. 연속된 숫자를 저장못했다.

만약 CCZ가 있으면 내가 처음에 짯던코드로는 sum이 2가 나와야 되는데, 1로 나오게됬다.

저장을 해놓고 else{}로 넘어갔어야 했는데, 안하고 넘어가 버린것이다.

이 부분을 인지한 반례가 있다.

 

3

ZCY

ZCP

PYZ

답 : 2

 

브루트포스는 초반설계와 반례가 정말 중요한것같다.

초반설계를 잘못하면 왜틀렸지?의 늪에 빠지게된다.

거기서 반례를 찾으면 고치기 쉽지만, 반례를 못찾으면 한없이 어렵다.

 

let n = Int(readLine()!)!
var arr: [[Character]] = Array(repeating: Array(repeating: "A", count: n), count: n)
var result = 0
var realResult = 0
for i in 0..<n {
    arr[i] = readLine()!.map{Character(String($0))}
}

for i in 0..<n { //가로 바꾸기
    for j in 0..<n{
        if j + 1 < n, arr[i][j] != arr[i][j + 1] {
            swap2DArray(i, j)
            let a = 가로()
            let b = 세로()
            result = max(a, b)
            swap2DArray(i, j)

        }
        realResult = max(result, realResult)
    }
}

for i in 0..<n { //세로 바꾸기
    for j in 0..<n{
        if j + 1 < n, arr[j][i] != arr[j + 1][i] {
            swap2DArray세로(j, i)
            let a = 가로()
            let b = 세로()
            result = max(a, b)
            swap2DArray세로(j, i)
        }
        realResult = max(result, realResult)
    }
}

print("\(realResult)")

func 가로() -> Int{ //가로 비교

    var prev = 0
    for k in 0..<n {
        var sum = 1
        for v in 0..<n {
            if v + 1 < n, arr[k][v] == arr[k][v + 1] {
                sum += 1
            }else if v + 1 < n, arr[k][v] != arr[k][v + 1]{
                prev = max(prev, sum)
                sum = 1
            }
        }
        prev = max(prev, sum)
    }
    return prev
}

func 세로() -> Int{ //세로 비교

    var prev = 0
    for k in 0..<n {
        var sum = 1
        for v in 0..<n {
            if v + 1 < n, arr[v][k] == arr[v + 1][k] {
                sum += 1
            }else if v + 1 < n, arr[v][k] != arr[v + 1][k]{
                prev = max(prev, sum)
                sum = 1
            }

        }

        prev = max(prev, sum)
    }
    return prev
}


func swap2DArray(_ a: Int, _ b: Int){
    let temp = arr[a][b]
    arr[a][b] = arr[a][b + 1]
    arr[a][b + 1] = temp
}
func swap2DArray세로(_ a: Int, _ b: Int){
    let temp = arr[a][b]
    arr[a][b] = arr[a + 1][b]
    arr[a + 1][b] = temp
}

 

 

댓글