경쟁 프로에서 사용할 수있는 편리한 확장 목록 (Swift)

저는 Swift에서 경쟁 전문 기사를 게시했습니다.
  • 경쟁 프로에서 사용할 수있는 표준 입력의 편리한 메소드 목록
  • 경쟁 프로에서 사용할 수있는 표준 오류 출력 방법
  • 경쟁 프로에서 사용할 수있는 편리한 익스텐션 목록 ← 이마 코코
  • 경쟁 프로에서 사용할 수있는 알고리즘 함수 목록

  • 스스로 무기를 늘려가는 것이 경프로의 재미의 하나라고 생각하고 있으므로, 우선은 스스로 생각하는 것이 추천입니다.
    아무래도 모를 때 내 기사가 도움이되면 기쁩니다

    소개



    이 기사는 Swift/Kotlin 애호회 Advent Calendar 2020의 11 일째 기사입니다.
    비어 있기 때문에 묻었습니다.

    경쟁 프로에서 사용할 수 있는 편리한 확장 메소드와 컴퓨티드 프로퍼티를 소개합니다.

    주의


  • 이 문서에서 소개하는 소스 코드가 올바른지 보장할 수 없습니다.
  • 이 문서는 수시로 업데이트될 예정입니다.

  • 환경


  • OS: macOS Big Sur 11.1
  • Xcode:12.3 (12C33)
  • Swift:5.3.2
    5.2.1 (2021/01/24 현재 AtCoder)에서도 작동

  • 경쟁 프로에서 사용할 수있는 편리한 확장 목록



    자릿수 분할



    설명

    숫자의 자리수를 분할해, 자리수의 내림차순으로 정렬한 배열로 돌려줍니다.


    소스 코드
    private extension Numeric where Self: LosslessStringConvertible {
        var digits: [Int] { string.digits }
    }
    private extension LosslessStringConvertible {
        var string: String { String(self) }
    }
    private extension StringProtocol {
        var digits: [Int] { compactMap { $0.wholeNumberValue } }
    }
    


    출력 예
    1.digits -> [1]
    32.digits -> [3, 2]
    445.digits -> [4, 4, 5]
    62096.digits -> [6, 2, 0, 9, 6]
    


    참고 링크
  • Swift - Int를 개별 자릿수로 분할
  • 제출 #18780201 - AtCoder Beginners Selection



  • 합계



    설명

    배열 등 순서의 요소의 합계를 돌려줍니다.


    소스 코드
    private extension Sequence where Element: AdditiveArithmetic {
        func sum() -> Element {
            reduce(.zero, +)
        }
    }
    


    출력 예
    [1].sum() -> 1
    [1, 3].sum() -> 4
    [1, 3, 4].sum() -> 8
    (1...5).sum() -> 15
    


    참고 링크
  • swift/Integers.swift at main · apple/swift



  • Decimal → Int 변환



    설명
    DecimalInt로 변환합니다.

    나는 pow()의 반환 값을 Int로 원할 때 사용합니다.


    소스 코드
    import Foundation
    
    private extension Decimal {
        var intValue: Int { NSDecimalNumber(decimal: self).intValue }
    }
    


    출력 예
    pow(2, 3).intValue -> 8
    pow(10, 6).intValue -> 1000000
    


    참고 링크
  • init(decimal:) | Apple Developer Documentation
  • intValue | Apple Developer Documentation



  • 10진수→2진수 변환



    설명

    10진수 숫자를 2진 문자열로 변환합니다.digit 에 필요한 충분한 크기의 값을 전달하지 않으면 오버플로우하므로 주의입니다.

    아직 AtCoder에서 사용한 적이 없습니다.


    소스 코드
    private extension FixedWidthInteger {
        func binaryString(digit: Int) -> String {
            var result: [String] = []
            for i in 0..<(Self.bitWidth / 8) {
                let byte = UInt8(truncatingIfNeeded: self >> (i * 8))
                let byteString = String(byte, radix: 2)
                let padding = String(repeating: "0", count: 8 - byteString.count)
                result.append(padding + byteString)
            }
            return String(result.reversed().joined().suffix(digit))
        }
    }
    


    출력 예
    0.binaryString(digit: 2) -> "00"
    1.binaryString(digit: 2) -> "01"
    2.binaryString(digit: 4) -> "0010"
    8.binaryString(digit: 8) -> "00001000"
    255.binaryString(digit: 8) -> "11111111"
    256.binaryString(digit: 8) -> "00000000" // !!!: オーバーフロー
    256.binaryString(digit: 12) -> "000100000000"
    


    참고 링크
  • FixedWidthInteger | Apple Developer Documentation
  • Swift에서 정수에서 2 진수 문자열을 원하면 FixedWidthInteger를 사용합시다 - Qiita



  • 소수 판정



    설명

    정수가 소수인지 여부를 결정합니다.

    아직 AtCoder에서 사용한 적이 없습니다.


    소스 코드
    private extension Int {
        var isPrime: Bool {
            guard self > 1 else {
                return false
            }
            return (2..<self).lazy.filter { self % $0 == 0 } .count == 0
        }
    }
    


    출력 예
    1.isPrime -> false
    2.isPrime -> true
    3.isPrime -> true
    4.isPrime -> false
    5.isPrime -> true
    


    참고 링크
  • 소수 - Wikipedia
  • 제출 # 173625 | 아르고 식



  • 회문 판정



    설명

    정수 또는 캐릭터 라인이 회문인지 판정합니다.

    아직 AtCoder에서 사용한 적이 없습니다.


    소스 코드
    private extension Int {
        var isPalindrome: Bool { String(self).isPalindrome }
    }
    
    private extension String {
        var isPalindrome: Bool { self == String(self.reversed()) }
    }
    


    출력 예
    1.isPalindrome -> true
    2.isPalindrome -> true
    10.isPalindrome -> false
    11.isPalindrome -> true
    100.isPalindrome -> false
    101.isPalindrome -> true
    


    참고 링크
  • 회문 - Wikipedia
  • 제출 #175165 | 아르고 식



  • 결론



    이상, Swift/Kotlin 애호회 Advent Calendar 2020의 11일째의 기사였습니다.

    참고 링크


  • uhooi/Programming-Swift-Solving: Solve competition programming using Swift.
  • 좋은 웹페이지 즐겨찾기