[Swift] AtCoder Beginner Contest 252の記録 【A問題・B問題・C問題】
概要
・開催日時:2022-05-21(土) 21:00-22:40
・参加前レーティング:34
・参加回数:3回目
・言語:Swift
結果
・A:Adjacent Squares(AC - 100)
・コンテスト内順位:7,693位/8,171位
・参加後レーティング:34→46 (灰色)+12
A問題で提出したコード
var array: [Int] = readLine()!.split(separator: " ").map { Int(String($0))! }
var N = array[0]
var charArray = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
print(charArray[N-97])
【ポイント】
・全文字が格納された配列を用意しておく。
・入力された値が97~122であるので、配列のインデックスに合わせるために、入力された値から97を引く。
・引いた値の配列を返す。
【感想】
・ザ・ゴミ実装でした。ASCIIを表現する方法が皆目見当つかずこういう実装になりました。
・こういう実装だと、たとえば文字数が100文字とかになると配列の要素数を100個書かないといけない、みたいなことになりかねません。気を付けます。
【解答例】
let n = Int(readLine()!)!
let c = Character(UnicodeScalar(n)!)
print(c)
B問題
【感想】
・テストケース(Sample)は3つともACだったのですが、非公開のテストケースだとWEになってしまい…改善方法が分からず、心が折れてしまいました。
・252は直近で稀に見るレベルで難易度のバランスが良かった回らしく、正直ここで詰まったことで自分の実力の限界を知ったような気がします。(せいぜい灰100くらいなんだろうな、、、)
【自分の回答】
import Foundation
var array: [Int] = readLine()!.split(separator: " ").map { Int($0)! }
var NK = (array[0], array[1])
var A: [Int] = readLine()!.split(separator: " ").map { Int($0)! }
var B: [Int] = readLine()!.split(separator: " ").map { Int($0)! }
var AMax = A.max()
let newArray = A.indices.filter({A[$0] == AMax})
for i in 0 ..< B.count {
for j in 0 ..< newArray.count {
var index = newArray[j]
if B[i] == index{
print("Yes")
exit(0);
}
}
}
print("No")
【正解例(一部改変)】
https://atcoder.jp/contests/abc252/submissions/31842496
let input = readLine()!.split(separator: " ").map{ Int(String($0))! } //extensionを削除
let n = input[0], k = input[1]
let a = readInts()
let b = Set(readInts())
var ans = false
let max = a.max()!
for i in 0..<n where a[i] == max {
if b.contains(i + 1) {
ans = true
break
}
}
print(ans ? "Yes" : "No")
・Swiftを使ってACされた方の中でを一番綺麗だと思ったコードを引用させていただきました。
【解答指針】
●用意する変数
・判定用boolを用意する。
・Aの最大値(おいしさが最大の食品)を取得する。
・A[i]が最大値の場合かつb[i + 1]と一致している場合trueを返す。
【反省】
AとBのforループが逆だったのか、indicesを使ったのがいけなかったのかわかりませんが、ACを目指して取り組もうと思います。
C問題
・自分の中で「必ずAとBを2完する」という目標があったのですが、今回はじめてC問題を見てみました。
【解答例】
https://atcoder.jp/contests/abc252/submissions/31851344
let n = Int(readLine()!)!
let m = 10
// counter[i][j] := 数iがj文字目にある個数
var counter = [[Int]](repeating: [Int](repeating: 0, count: m), count: m)
for _ in 0..<n {
let s = Array(readLine()!)
for j in 0..<m {
counter[Int(String(s[j]))!][j] += 1
}
}
var ans = Int.max
for i in 0..<m {
var t = 0
for j in 0..<m {
t = max(t, (counter[i][j] - 1) * 10 + j)
}
ans = min(ans, t)
}
print(ans)
うーん、わかんないや!w
次回は来週土曜日の「NOMURAプログラミングコンテスト(AtCoder Beginner Contest 253)」に参加させていただきます。よろしくお願いいたします。