0
0

More than 1 year has passed since last update.

【競プロ/Swift】まよコン 2023/03/13

Posted at

注意事項

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

正解済み問題

A - Saturday

問題文
こちら問題ページ

解答
入力された曜日から次の土曜日が何日後かを出力するだけ。
switch文で解答。

switch readLine()! {
case "Monday": print(5)
case "Tuesday": print(4)
case "Wednesday": print(3)
case "Thursday": print(2)
case "Friday": print(1)
default: break
}

B - Multiplication 2

問題文
こちら問題ページ

解答
割と例外パターンを網羅できず、最終的には以下の解答でなんとかAC。
ポイントは
Decimalで計算しないと正確な値が出ないこと。(Intとかだと正確に計算できなかった。)
例外パターンとして、isNaNで不正な値が渡された時のことも考える。
isNaNなんて普段使わないから、全く気づかなかった。。

import Foundation
let n = Int(readLine()!)!
let aArray = readLine()!.split(separator: " ").map{Decimal(Int($0)!)}.sorted()

var result: Decimal = aArray[0]
for index in 1..<n {
    result = result * aArray[index]
}

if result > 1000000000000000000 || result.isNaN {
    print(-1)
} else {
    print(result)
}

誤答及び、未解答問題

C - Streamline

問題文
こちら問題ページ

未解答
問題の意味はわかったが、どう答えたら良いか分からず1回も解答せずに終わった。

以下途中まで書いたやつ。

import Foundation
let nm = readLine()!.split(separator: " ").map{Int($0)!}
let xArray = readLine()!.split(separator: " ").map{Int($0)!}.sorted()
var marginArray: [Int] = []

if nm[1] < nm[0] {
    print(0)
}

for index in 0..<(nm[1] - 1) {
    marginArray.append(xArray[index] - xArray[index + 1])
}


var pointArray: [Int] = []

for _ in 0..<nm[0] {
    var tmpArray = marginArray
    let maxIndex = tmpArray.firstIndex(where: {$0 == tmpArray.max()})
    pointArray.append(xArray[maxIndex!])
    tmpArray.remove(at: maxIndex!)
}

正答
方法としては与えられた数列を大きさ順にソートした後、各値の距離を大きい順に配列にまとめる。
そしてコマを差分が大きい座標から当てはめていけば、初期座標で一番移動時間がかかる座標を埋められて、あとは初期座標で埋められなかった移動距離を順番に足していくと、最小操作回数がわかる。

まじでかしこい、早くこんな発想を自分でできるようになりたい。

let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = input[0]
let m = input[1]
let x: [Int] = readLine()!.split(separator: " ").map { Int(String($0))! }

// 与えられる数字をソートして整理する。
let sorted = x.sorted()//.map{ $0 - x.min()! + 1 }

// コマの数より数列の数が少ない場合は、操作回数0回
if n >= m {
    print(0)
    
} else {
    var distance: [Int] = []
    // ソートされた数列の移動距離を配列にまとめる。
    for i in 1..<sorted.count {
        distance.append(sorted[i] - sorted[i-1])
    }
    // 移動距離を降順に並べる。
    distance.sort(by: > )

    // 差分が大きい値からコマを置いていき、一番右のコマを最右まで動かせば最短操作で全ての値を踏める。
    let moves = distance[(n-1)...distance.endIndex-1]
    let ans = moves.reduce(0) { $0 + $1 }
    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