Today 12/19
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에 저장을 하고, 다른 시작점으로 계속 옮겨가면서 완전탐색을 한다.
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()!)
현 위치에서 직사각형까지 가로/세로로 가장 짧은 경로 구하면 되는 문제이다.
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)
}
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에만 적용되니, 주의하자.