1018 체스판 다시 칠하기, 1085 직사각형에서 탈출, 1259 펠린드롬수

Choong Won, Seo·2021년 12월 19일
0

백준

목록 보기
2/29
post-thumbnail

Today 12/19

체스판 다시 칠하기 (My Code)

let MN = readLine()!.split(separator: " ").map{Int(String($0))!}
let M = MN[0]
let N = MN[1]
var board: [[String]] = Array(repeating: [], count: M)
var minimum = 64

for row in 0...M-1 {
    board[row] = readLine()!.map{String($0)}
}

for startCol in 0...N-8 {
    for startRow in 0...M-8 {
        var Wstart = 0
        var Bstart = 0
        for col in startCol...startCol+7 {
            for row in startRow...startRow+7 {
                if (row+col)%2 == 0 {
                    if board[row][col] == "W" {
                        Bstart += 1
                    } else {
                        Wstart += 1
                    }
                }
                else {
                    if board[row][col] == "W" {
                        Wstart += 1
                    } else {
                        Bstart += 1
                    }
                }
            }
        }
        let change = min(Wstart, Bstart)
        if change < minimum {
            minimum = change
        }
    }
}
print(minimum)

완전탐색 말고 다른 방법이 있을까 고민하다가 방법이 없을 것 같아서 4중 for문으로 풀어봤다.

근데 다른 방법이 없는 것 같기도 하다..

Idea & Solving

row+col%2가 0인 곳을 W라고 그냥 가정을 해버리고, 그렇게 되면, row+col%2가 1인 곳은 B가 된다.

그래서 규칙에 안맞는 곳들을 다시 색칠한다고 숫자를 세고, Wstart변수에 저장을 한다.

반대로 규칙에 맞는 곳들은 다른 변수로 다시 색칠한다고 숫자를 세고, Bstart변수에 저장을 한다.

Wstart와 Bstart 중 작은 숫자를 minimum에 저장을 하고, 다른 시작점으로 계속 옮겨가면서 완전탐색을 한다.

직사각형에서 탈출 (My Code)

let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let east = input[0]
let west = input[2]-input[0]
let north = input[3]-input[1]
let south = input[1]
let map = [east,west,north,south]
print(map.min()!)

현 위치에서 직사각형까지 가로/세로로 가장 짧은 경로 구하면 되는 문제이다.

팰린드롬수 (My Code)

while true {
    let input = readLine()!
    if input == "0" { break }
    let inputArr = input.map{String($0)}
    var correct = "yes"
    
    for index in 0...inputArr.count-1 {
        if inputArr[index] == inputArr[inputArr.count-1-index] {
            correct = "yes"
        } else {
            correct = "no"
            break
        }
    }
    print(correct)
}

팰린드롬수 (Other Code)

while let p = readLine(), p != "0" {
    print(p == String(p.reversed()) ? "yes" : "no")
}

나는 배열로 만들어서 한 자 한 자 비교했는데, 그냥 reversed() 때려서 같나 보면 가장 쉬운 것 같다.

나는 while true를 사용했는데, while let p = readLine(), p != "0" 이런 식으로 쓰면 더 간결하다.

reversed()는 Int는 적용 안되고 String에만 적용되니, 주의하자.

profile
UXUI Design Based IOS Developer

0개의 댓글