요구능력 : 찐노가다
코드설명 :
전체적인 코드 설계는 아래와 같다.
(조건 : 현재 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
}
'Algorithm > 문제풀이_백준' 카테고리의 다른 글
[Swift][DFS/BFS] 백준 1260번 (DFS와 BFS) (0) | 2021.09.09 |
---|---|
[Swift][Stack] 백준 10828번 (스택) (0) | 2021.09.09 |
[Swift][DP] 백준 2193번 (이친수) (0) | 2021.09.07 |
[Swift][BruteForce] 백준 10972번(다음순열) (0) | 2021.09.07 |
[Swift] 백준 10816번(숫자 카드2) (0) | 2021.09.03 |
댓글