0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Swiftで解くAtCoder(ABC304)

Last updated at Posted at 2023-06-05

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.さいごに

間違いや改善点等あれば、ご指摘いただけると幸いです。
何卒よろしくお願いいたします。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?