MUKER_DEV with iOS

[swift] λ°±μ€€ - 1018번: 체슀판 λ‹€μ‹œ μΉ ν•˜κΈ° λ³Έλ¬Έ

πŸ€– μ•Œκ³ λ¦¬μ¦˜/BAEKJOON

[swift] λ°±μ€€ - 1018번: 체슀판 λ‹€μ‹œ μΉ ν•˜κΈ°

MUKER 2023. 2. 11. 23:29
 

1018번: 체슀판 λ‹€μ‹œ μΉ ν•˜κΈ°

첫째 쀄에 Nκ³Ό M이 주어진닀. Nκ³Ό M은 8보닀 ν¬κ±°λ‚˜ κ°™κ³ , 50보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” λ³΄λ“œμ˜ 각 ν–‰μ˜ μƒνƒœκ°€ 주어진닀. BλŠ” 검은색이며, WλŠ” 흰색이닀.

www.acmicpc.net

문제 ν‘ΈλŠ” 데 μžˆμ–΄ 도움이 λ˜λ„λ‘ λ‚˜μ˜ 풀이와 κ°œμ„ λœ 풀이λ₯Ό μ˜¬λ¦½λ‹ˆλ‹€.
λ˜ν•œ 풀이 ν›„ λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이λ₯Ό 보고 μ°Έκ³ ν• λ§Œν•œ 풀이도 μ˜¬λ¦½λ‹ˆλ‹€.

- λ¬Έμ œμ— 따라 λ‚˜μ˜ ν’€μ΄λ§Œ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
- ν•΄λ‹Ή 풀이듀은 풀이 쀑 ν•˜λ‚˜μΌ 뿐 μ΅œμ„ μ˜ ν’€μ΄λŠ” 아닐 수 μžˆμŠ΅λ‹ˆλ‹€.

 


 

문제 μ„€λͺ…

 

M*N의 λ³΄λ“œνŒμ΄ μžˆμŠ΅λ‹ˆλ‹€.

8*8μ²΄μŠ€νŒμ„ λ§Œλ“€κΈ° μœ„ν•΄

M*N λ³΄λ“œνŒμ—μ„œ 8*8만큼 λ–Όμ–΄ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

체슀판의 처음, 즉 [0][0]은 '흰색'으둜 μ‹œμž‘ν•˜κ±°λ‚˜ '검은색'으둜 μ‹œμž‘ν•˜κ³ 

λ§žλŒ€λŠ” 변은 λ°˜λŒ€μ˜ 색이 λ‚˜μ˜€κ²Œ λ©λ‹ˆλ‹€.

 

M*N λ³΄λ“œνŒμ—μ„œ 8*8만큼 λ–Όμ˜¬ λ•Œ

μ΅œμ†Œν•œμœΌλ‘œ λ³΄λ“œνŒμ„ μˆ˜μ •ν•˜μ—¬ μ²΄μŠ€νŒμ„ λ§Œλ“€ 수 μžˆμ„μ§€ κ΅¬ν•˜λ©΄ λ©λ‹ˆλ‹€.

 


 

λ‚˜μ˜ 풀이

import Foundation

let blackBoard = [["B","W","B","W","B","W","B","W"],
                  ["W","B","W","B","W","B","W","B"],
                  ["B","W","B","W","B","W","B","W"],
                  ["W","B","W","B","W","B","W","B"],
                  ["B","W","B","W","B","W","B","W"],
                  ["W","B","W","B","W","B","W","B"],
                  ["B","W","B","W","B","W","B","W"],
                  ["W","B","W","B","W","B","W","B"]]

let whiteBoard = [["W","B","W","B","W","B","W","B"],
                  ["B","W","B","W","B","W","B","W"],
                  ["W","B","W","B","W","B","W","B"],
                  ["B","W","B","W","B","W","B","W"],
                  ["W","B","W","B","W","B","W","B"],
                  ["B","W","B","W","B","W","B","W"],
                  ["W","B","W","B","W","B","W","B"],
                  ["B","W","B","W","B","W","B","W"]]

let input = readLine()!.split(separator: " ").map { Int($0)! }
var board = [[String]]()
var count = 65

for _ in 0..<input[0] { board.append((readLine()!.map { String($0) }))  }

for i in 0..<input[0]-7 {
    for j in 0..<input[1]-7 {
        var Bcount = 0
        var Wcount = 0
        for k in 0..<8 {
            for l in 0..<8 {
                if board[i+k][j+l] != blackBoard[k][l] { Bcount += 1 }
                if board[i+k][j+l] != whiteBoard[k][l] { Wcount += 1 }
            }
        }
        let min = min(Bcount, Wcount)
        if count > min { count = min }
    }
}
print(count)

 

미리 '흰색'으둜 μ‹œμž‘ν•˜λŠ” 체슀판과

'검은색'으둜 μ‹œμž‘ν•˜λŠ” 체슀판 배열을 λ§Œλ“€μ–΄λ†¨μŠ΅λ‹ˆλ‹€.

 

주어진 M*N λ³΄λ“œμ—μ„œ μ™Όμͺ½ μœ„ λΆ€ν„° 8*8만큼 λ–Όμ–΄λ‚΄

문자 ν•˜λ‚˜ν•˜λ‚˜λ₯Ό 미리 λ§Œλ“€μ–΄λ†“μ€ 두 개의 체슀판과 λΉ„κ΅ν–ˆμŠ΅λ‹ˆλ‹€.

 

흰색,검은색 체슀판과의 비ꡐ가 λλ‚˜κ³ 

더 적게 ν‹€λ¦¬λŠ” 체슀판의 countλ₯Ό κΈ°μ–΅ν•©λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ M*Nλ³΄λ“œ 전체λ₯Ό λ‹€ νƒμƒ‰ν•˜λ©° λΉ„κ΅ν•˜μ—¬

μ΅œμ†Œν•œμ˜ κ²°κ³Όλ₯Ό λ„μΆœν•©λ‹ˆλ‹€.

 


 

μ°Έκ³ ν• λ§Œν•œ 풀이

let input = readLine()!.split(separator: " ").map{ Int($0)! }
let (N, M) = (input[0], input[1])
let board = (0..<N).map{ _ in readLine()!.map{ String($0) }}

func shouldRepaint( _ i: Int, _ j: Int) -> Bool {
    return board[i][j] != ((i + j) % 2 == 0 ? "B" : "W" )
}

var min = 64
for i in 0...(N-8) {
    for j in 0...(M-8) {
        var repaint = 0
        for ii in i..<i+8 { 
            for jj in j..<j+8 where shouldRepaint(ii, jj) { 
                repaint += 1
            }
        }
        if repaint > 32 { repaint = 64-repaint }
        if repaint < min { min = repaint}
    }
}
print(min)
let NM = readLine()!.split{$0==" "}.map{Int(String($0))!}
let N = NM.first!, M = NM.last!
var chess: [[String]] = [], res = 64

for _ in 0..<NM.first! {
    chess.append(readLine()!.map{String($0)})
}

for row in 0...(N-8) {
    for col in 0...(M-8) {
        var cnt = 0
        
        for i in row..<(row+8) {
            for j in col..<(col+8) where chess[i][j] != ((i+j)%2 == 0 ? "B":"W") {
                cnt+=1
            }
        }
        res = min(res, cnt, 64-cnt)
    }
}
print(res)