注意事項
本記事は復習のための日記的なものであり、丁寧な解説を求めている方には不十分かと思われますので、ご了承のほどお願いいたします。
正解済み問題
A - Probably English
問題文
こちら問題ページ
解答
入力値に該当の値があったらYesを出力、なかったらNoを出力。
let _ = Int(readLine()!)!
let wArray = readLine()!.split(separator: " ")
if wArray.contains("and") || wArray.contains("not") || wArray.contains("that") || wArray.contains("the") || wArray.contains("you") {
print("Yes")
} else {
print("No")
}
C - Socks
問題文
こちら問題ページ
解答
靴下が何回ペアになるかを判断すればいいから、同一の値の数をカウントし、そのカウント値を2で割って、小数点を省いた値を足していけば、答えが出力できる。
import Foundation
let n = Int(readLine()!)!
let aArray = readLine()!.split(separator: " ").map{ Int($0)! }.sorted()
let counter = NSCountedSet(array: aArray)
let counts = Set(aArray).map { (counter.count(for: $0)) }
var total = 0
for count in counts {
total += Int(count / 2)
}
print(total)
誤答及び、未解答問題
B - Bombs
問題文
こちら問題ページ
誤答
ループ処理を避けたくて、色々考えいたら結局未解答のまま終了。
正答
大きくは爆弾の集計と出力の2つのループ処理に分けて行う。
変数をしっかり切り分けて思考の整理するのと、爆弾の威力範囲内かの計算を冷静に考えられていたら正解できたかも。。
let r = Int(readLine()!.split(separator: " ")[0])!
var grid = [[Character]]()
var bombs = [(i: Int, j: Int, power: Int)]()
// グリッドの入力値の集計と爆弾位置の集計処理
// 縦軸ループ
for i in 0..<r {
// 1文字ずつ配列化
let input = [Character](readLine()!)
// 横軸ループ
for j in 0..<input.count {
// ボムの箇所を「縦軸位置、横軸位置、威力」の辞書型で集計していく。
if let bomb = Int(String(input[j])) {
bombs += [(i: i, j: j, power: bomb)]
}
}
// 1行ごと追加することで、グリッド化
grid.append(Array(input))
}
// 出力値の生成処理
// 縦軸ループ
for i in 0..<r {
var output = ""
// 横軸ループ
for j in 0..<grid[i].count {
// 爆発後は#以外は全て.になる
guard grid[i][j] == "#" else {
output += "."
continue
}
// 元々#だった箇所が爆発範囲に含まれるか判定
output += bombs.contains {
// 縦軸差分と横軸差分の合計が威力以下だったら射程範囲内
abs($0.i - i) + abs($0.j - j) <= $0.power
} ? "." : "#"
}
// 1行ずつ出力(改行の必要なし)
print(output)
}
参考