LoginSignup
0
0

More than 1 year has passed since last update.

【競プロ/Swift】AtCoder Beginner Contest 292

Last updated at Posted at 2023-03-09

注意事項

本記事は復習のための日記的なものであり、丁寧な解説を求めている方には不十分かと思われますので、ご了承のほどお願いいたします。

正解済み問題

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)

参考

0
0
0

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