1.はじめに
この記事では、AtCoder(ABC304)のA~C問題をACしたコードの公開, 解説を行います。
Swiftを使ってコンテストに参加する方の参考になれば幸いです。
2.事前準備
標準入力を読み込むためのメソッドです。
コードの先頭に貼り付けて、適宜使用します。
import Foundation
// 標準入力から整数を読み込む
func readInt() -> Int{
return Int(readLine()!)!
}
// 標準入力から整数列を読み込む
func readInts() -> [Int]{
return readLine()!.split(separator: " ").map { Int(String($0))! }
}
// 標準入力から文字列を読み込む
func readString() -> String{
return readLine()!
}
// 標準入力から文字列配列を読み込む
func readStrings() -> [String]{
return readLine()!.split(separator: " ").map { String($0) }
}
3.A - First Player
問題文や制約はこちらからご確認ください。
入力をN, S[], A[]で受け取ります。
let N = readInt()
var S = [String]()
var A = [Int]()
for _ in 0..<N {
let nextLine = readStrings()
S.append(nextLine[0])
A.append(Int(nextLine[1])!)
}
年齢が最も低い人の番号を特定します。
var minNum = 0
var minAge = A[0]
for i in 1..<N {
if minAge > A[i] {
minNum = i
minAge = A[i]
}
}
特定した番号を起点として名前を出力します。
for i in 0..<N {
if i+minNum < N {
print(S[i+minNum])
} else {
print(S[i+minNum-N])
}
}
4.B - Subscribers
問題文や制約はこちらからご確認ください。
入力をNで受け取ります。
var N = readInt()
Int型で割り算をすると、小数点以下が切り捨てられる性質を利用します。
例) 100でわった後、100をかけることで、10の位以下が切り捨てられる。
if N < 1_000 {
} else if N < 10_000 {
N = N / 10 * 10
} else if N < 100_000 {
N = N / 100 * 100
} else if N < 1_000_000 {
N = N / 1_000 * 1_000
} else if N < 10_000_000 {
N = N / 10_000 * 10_000
} else if N < 100_000_000 {
N = N / 100_000 * 100_000
} else if N < 1_000_000_000 {
N = N / 1_000_000 * 1_000_000
}
切り捨て処理を行った後、出力します。
print(N)
5.C - Virus
問題文や制約はこちらからご確認ください。
AtCoder ProblemsによるDifficultyは366になります。
入力をN, D, X[], Y[]で受け取ります。
let line1 = readInts()
let N = line1[0]
let D = line1[1]
var X = [Int]()
var Y = [Int]()
for _ in 0..<N {
let nextLine = readInts()
X.append(nextLine[0])
Y.append(nextLine[1])
}
感染者の情報をhasVirus[]で管理します。
初期値は人1のみtrue, 他はfalseになります。
var hasVirus = [Bool]()
for _ in 0..<N {
hasVirus.append(false)
}
hasVirus[0] = true
再帰関数を使用して、最終的に誰に感染するか求めます。
入力として感染者の座標を渡します。
ユークリッド距離内に人がいる場合、
その人の感染情報hasVirusが正となり、
再帰関数を再度呼び出します。
func checkVirusSpread(x: Int, y: Int) {
for i in 0..<N {
if !hasVirus[i] {
let xD = x-X[i]
let yD = y-Y[i]
if sqrt(Double(xD * xD + yD * yD)) <= Double(D) {
hasVirus[i] = true
checkVirusSpread(x: X[i], y: Y[i])
}
}
}
}
checkVirusSpread(x: X[0], y: Y[0])
ウイルスに感染している人のみ出力します。
for i in 0..<N {
print(hasVirus[i] ? "Yes" : "No")
}
6.さいごに
間違いや改善点等あれば、ご指摘いただけると幸いです。
何卒よろしくお願いいたします。