注意事項
本記事は復習のための日記的なものであり、丁寧な解説を求めている方には不十分かと思われますので、ご了承のほどお願いいたします。
正解済み問題
A - CAPS LOCK
問題文
こちら問題ページ
解答
入力値を大文字で出力するだけ。
let S = readLine()!
print(S.uppercased())
B - Yellow and Red Card
問題文
こちら問題ページ
解答
与えられる指示に対する処理をfor分で回して、順次switch分で該当の処理を実行していく。
let NQ = readLine()!.split(separator: " ").map{Int($0)!}
var nArray = Array(1...NQ[0]).map{[$0, 0]}
for _ in 0..<NQ[1] {
let event = readLine()!.split(separator: " ").map{Int($0)!}
switch event[0] {
case 1: if nArray[event[1] - 1][1] < 2 { nArray[event[1] - 1][1] += 1 }
case 2: if nArray[event[1] - 1][1] < 2 { nArray[event[1] - 1][1] = 2 }
case 3: print(nArray[event[1] - 1][1] == 2 ? "Yes" : "No")
default: break
}
}
誤答及び、未解答問題
C - Four Variables
問題文
こちら問題ページ
誤答
C問題から一気に難易度上がりすぎ笑
今回も実行時間制限超過でクリアならず。。。
dividorsメソッドで引数で与えられた値から、その値を生成する乗算の組み合わせを返す。
例えば引数4なら
[[1, 4],[2, 2], [4, 1]]
を返す。
そのdividorでiからなる配列とn - iからなる配列の個数を掛け合わして、足していくことでパターン総数を出力する処理。
出力は合ってると思うけど、色々無駄な処理が多いぽくて、実行時間超過エラーに。
import Foundation
func divisors(value: Int) -> Set<[Int]> {
var divisors: Set<[Int]> = []
if value == 1 { return [[1, 1]]}
for num in 1...value where value % num == 0 {
divisors.insert([num, value / num])
}
return divisors
}
let N = Int(readLine()!)!
var counter = 0
for num in 1..<N {
let divisors1 = divisors(value: num)
let divisors2 = divisors(value: N - num)
counter += divisors1.count * divisors2.count
}
print(counter)
正答
1つ目のfor文でAB+CD=NのABとCDのパターン集計していく。
2つ目のfor文でABのパターン数xCDのパターン数で、その組み合わせの総パターン数を集計していく。
let n = Int(readLine()!)!
var counter: [Int: Int] = [:]
for i in 1..<n {
for j in i..<n {
let x = i * j
if x >= n { break }
counter[x, default: 0] += i == j ? 1 : 2
}
}
var ans = 0
for i in 1..<n {
let leftValue = counter[i] ?? 0
let rightValue = counter[n - i] ?? 0
if leftValue > 0, rightValue > 0 {
ans += leftValue * rightValue
}
}
print(ans)
参考