LoginSignup
0
0

More than 1 year has passed since last update.

【競プロ/Swift】AtCoder Beginner Contest 291

Last updated at Posted at 2023-03-04

注意事項

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

正解済み問題

A - camel Case

問題文
こちら問題ページ

解答
受け取った文字列の内に何文字大文字があるかを判定。
文字列をfor分で1文字ずつ流して、String側の標準APIのisUppercaseを使用することで大文字か判定。
最終的に集計した値を出力することで解答。

let S = readLine()!
 
var counter = 1
 
for str in S {
  if str.isUppercase {
    break
  }
  counter += 1
}
 
print(counter)

B - Trimmed Mean

問題文
こちら問題ページ

解答
入力値Nの数分の最小値と最大値を入力値xArrayから取り除き、残されてた値の平均値を求める処理。
N回ループを回し、xArrayから最大値と最小値のIndexを見つけ取り除いていく。
最終的に残された値の合計をreduceでも求めて、あとは残された値の数で割って、平均値を出力する。

let N = Int(readLine()!)!
var xArray = readLine()!.split(separator: " ").map{Int($0)!}
 
for _ in 0..<N {
    let maxValue = xArray.max()
    let minValue = xArray.min()
    if let index = xArray.firstIndex(where: { $0 == maxValue }) {
        xArray.remove(at: index)
    }
    if let index = xArray.firstIndex(where: { $0 == minValue }) {
        xArray.remove(at: index)
    }
}
 
print(Float(xArray.reduce(0, +)) / Float(xArray.count))

誤答及び、未解答問題

C - LRUD Instructions 2

問題文
こちら問題ページ

誤答
実行時間制限超過により誤答。
N個の文字列Sは「RLUD」で構成されており、
Rの場合はx座標を+1
Lの場合はx座標をー1
Uの場合はy座標を+1
Dの場合はy座標をー1
する。

最終的に座標移動開始から終了まで、同じ座標を踏んだかを判定する。

let N = Int(readLine()!)!
let S = Array(readLine()!)
 
var xy = [0, 0]
var xyHistory = ["00"]
 
var isPositioned = false
 
for num in 0..<N {
    if S[num] == "R" {xy[0] += 1}
    else if S[num] == "L" {xy[0] -= 1}
    else if S[num] == "U" {xy[1] += 1}
    else if S[num] == "D" {xy[1] -= 1}
 
    if xyHistory.contains("\(xy[0])" + "\(xy[1])") {
        isPositioned = true
        break
    } else {
        xyHistory.append("\(xy[0])" + "\(xy[1])")
    }
}
 
print(isPositioned ? "Yes" : "No")

正答
原因は過去の座標入れている変数にSetを使用していなかったのが、原因みたいです。
Setにしないと処理速度が遅くなるみたいですね。

let N = Int(readLine()!)!
let S = Array(readLine()!)
 
var xy = [0, 0]
var visited: Set<[Int]> = [[0, 0]]
 
var isPositioned = false
 
for num in 0..<N {
    if S[num] == "R" {xy[0] += 1}
    else if S[num] == "L" {xy[0] -= 1}
    else if S[num] == "U" {xy[1] += 1}
    else if S[num] == "D" {xy[1] -= 1}
 
    if visited.contains([xy[0], xy[1]]) {
        isPositioned = true
        break
    }
    visited.insert([xy[0], xy[1]])
}
 
print(isPositioned ? "Yes" : "No")

参考

https://atcoder.jp/contests/abc291
https://qiita.com/Saayaman/items/4f3f63048d1d5924a829#set%E3%81%AB%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BF%E3%82%A4%E3%83%97%E3%81%AF%E4%BF%9D%E5%AD%98%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%AE
https://qiita.com/KyoheiG3/items/0bf9887a55fe7ad05811

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