4
5

More than 5 years have passed since last update.

Swift5.0.1でAtcoder!

Last updated at Posted at 2019-07-10

すみません。気が早いです。

Atcoderの言語アップデートシートにSwift5.0.1を追加しておいたので,追加されてくれ...!!!

c++のコレはSwiftでこう書くってのをまとめます。随時更新


std:cin, scanf

これないです(草)

Swiftの場合,標準入力は readLine() のみになります。演算子を自作して配列をタプルで返却させることで同じような書き方ができます。

追記:Stringにsplitがあった

import Foundation
prefix operator *
prefix func * <T> (a: [T]) -> (T, T) {return (a[0], a[1])}

// let (a, b) = *readLine()!.components(separatedBy: " ").map({Int($0)!})
let (a, b) = *readLine()!.split(separator: " ").map({Int($0)})
print(a, b)

// 入力:1 4
// 出力:1 4

3つのタプル版が欲しい時は,増やしましょう

prefix func * <T> (a: [T]) -> (T, T, T) {return (a[0], a[1], a[2])}

std:cout, printf

printf みたいにフォーマットしたい時は String を間に挟む必要があります。

let hoge = 1, huga = 2
// std:cout
print(hoge) // 出力:1\n
// printf
print(String(format: "%03d", hoge)) // 出力:001\n
print(String(format: "%03d", hoge), terminator: "") // 出力:001
print(hoge, huga) // 出力:1 2
print(hoge, huga, separator: "!") // 出力:1!2

print の引数として terminator: 最後にprintする文字列 , separator: 項目間にprintする文字列 を与えることができるので,改行なしや指定文字で区切る等ができます。


if, for, while

条件は () で囲まなくて良いが,コードブロックは {} で必ず囲む

// if
if 条件 {処理} else if 条件 {処理}
// while
while 条件 {処理}
// do-while
repeat {処理} while 条件
// for
for 定数 in  option(where 条件式) {処理}

// 0から9を表示する
for i in 0..<10 {print(i)}

ちなみに範囲演算子 ..< は以上未満で, は以上以下です。


switch

swiftにもswich-caseがあります。

※breakが要りません


配列 Array

Swiftの配列 Array は可変長なので vector みたいに使えます

// 宣言
var a: [Int] = [1, 2, 4, 5, 0]
var b: [Int] = []
var c = Array<Int>()

どれでもいい

対応は下記の通り

vector<int> cpp(5, 0);
var swift = [Int](repeating: 0, count: 5)

cpp[n]                    swift[n]
cpp.size()                swift.count
cpp.push_back(T)          swift.append(T)
cpp.pop_back()            swift.removeLast()
cpp.front()               swift.first!
cpp.back()                swift.last!
cpp.erase(cpp.begin()+n)  swift.remove(n)

詳しくは↓


辞書 Dictionary

var a = ["Swift": 2014, "Objective-C": 1983]
var b: [String: Int] = [:]
var c = Dictionary<String, Int>()

a["key"] のようにアクセスします。ただし返り値はオプショナルになります。

詳しくは↓


pair

Swiftにはpairがないです。そのため,自前で実装するかタプルを使います。

例題:ABC131-D

これは締め切りが早い順に片付けるのが想定解です。Atcoderの解説PDFではc++でpairを使っています。

import Foundation

prefix operator *
prefix func * <T> (a: [T]) -> (T, T) {return (a[0], a[1])}

func readInt() -> [Int] {return readLine()!.components(separatedBy: " ").map({Int($0)!})}

func main() {
    let N = Int(readLine()!)!
    var tasks: [(Int, Int)] = []// タプルを使ってタスクを持つ
    for _ in 0..<N {
        tasks.append(*readInt())
    }
    tasks.sort(by: {return $0.1 < $1.1}) // returnは無くてもいい
    var isYes = true
    var sum = 0
    for (a, b) in tasks {
        sum += a
        if sum > b {
            isYes = false
            break;
        }
    }
    print(isYes ? "Yes" : "No")
}
main()

タプルのソートをする場合,クロージャでどう入れ替えるかを渡す必要があります。

True になるようにソートされるので,この場合昇順です。

あ,サンプルしか動かしてないのでわかんないです。

おわり

とりあえずこれだけわかってればABC-Cまでは解けるんじゃないですかね?

4
5
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
4
5