🍁

Swiftでアルゴ式を進める時に便利な関数たち(随時更新)

2021/11/12に公開
3

アルゴ式

https://algo-method.com/

アルゴ式は
・プログラミングや情報科学をコツコツ学べる「教科書」
・学んだ内容をゲーム感覚で大量に実践できる「練習問題」
の2つで構成される、Web上で完結した学習コンテンツです。

アルゴリズムの復習でもしてみようということで始めました。

便利な関数たち

utils.swift
import Foundation

// 標準入力から整数をひとつ取得
func readInt() -> Int {
    return Int(readLine()!)!
}

// 標準入力から空白区切りの文字列を配列で取得
func readArrayString() -> [String] {
    return readLine()!.split(separator: " ")
        .map { String($0) }
}

// 標準入力から空白区切りの整数を配列で取得
func readArrayInt() -> [Int] {
    return readLine()!.split(separator: " ")
        .map { Int(String($0))! }
}

// 標準出力にYesかNoを出力(アルゴ式でよくある出力)
func printYesNo(_ flag: Bool) {
    print(flag ? "Yes" : "No")
}

// もらった整数が素数かどうかをそこそこの速さで判定
func isPrime(n: Int) -> Bool {
    if n == 1 { return false }
    if n == 2 { return true }
    if n % 2 == 0 { return false }
    var i = 3
    while i * i <= n {
        if n % i == 0 { return false }
        i += 2
    }
    return true
}

// もらった整数の約数を配列で返す
func divisor(n: Int) -> [Int] {
    var array = [Int]()
    var i = 1
    while i * i <= n {
        if n % i == 0 {
            array.append(i)
            if i * i != n {
                array.append(n / i)
            }
        }
        i += 1
    }
    return array.sorted()
}

// 文字列を反転する
func reversedString(str: String) -> String {
    return String(str.reversed())
}

// 回文かどうかを判定する(アルゴ式は回文が好きらしい)
func isPalindrome(str: String) -> Bool {
    return str == reversedString(str: str)
}

Discussion

uhooiuhooi

printYesNo(_:) メソッド便利ですね…!
処理は変わりませんが、こう書くとスッキリしますね↓

func printYesNo(_ flag: Bool) {
-   if flag {
-       print("Yes")
-   } else {
-       print("No")
-   }
+   print(flag ? "Yes" : "No")
}
uhooiuhooi

あと約数列挙ですが、現状だと計算量が O(n) になっています。
AtCoder では O(\sqrt{n}) にしないと解けない問題があったので注意です。