opendoor_life

'개발자의 성장일기'가 되었으면 좋겠습니다만?

Dev/Algorithm

Swift Algorithm :: 백준 1000번 A+B 알고리즘 풀이 (+ TIL, Today I Learned)

opendoorlife 2021. 1. 5. 03:03
반응형

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력
첫째 줄에 A+B를 출력한다.

 

Solution 1

- 시간 : 12 ms

- 메모리 : 79,108 KB

- 코드길이 : 133 B

import Foundation

let line = readLine()!
let lineArr = line.components(separatedBy: " ")
print(Int(lineArr[0])! + Int(lineArr[1])!)

 

Solution 2

- 시간 : 12 ms

- 메모리 : 79,112 KB

- 코드길이 : 131 B

import Foundation

let line = readLine()!
let intArr = line.components(separatedBy: " ").map{ Int($0)! }
print(intArr.reduce(0, +))

 

Solution 3

- 시간 : 8 ms

- 메모리 : 62,168 KB

- 코드길이 : 73 B

print((readLine()?.split(separator: " ").map { Int($0)! }.reduce(0, +))!)

 

(+) 백준 맞은 사람 등수 기준 : 시간 > 메모리 > 코드길이

 


 

 𝐓𝐨𝐝𝐚𝐲 𝐈 𝐋𝐞𝐚𝐫𝐧𝐞𝐝 

1. readLine(strippingNewline:)

- 공식문서 developer.apple.com/documentation/swift/1641199-readline

- Function :: Returns a string read from standard input through the end of the current line or until EOF(end-of-file) is reached.

- 현재 줄의 끝까지 또는 파일 끝에 도달할 때까지 표준 입력에서 읽은 문자열을 반환합니다.

- Framework Swift Standard Library

 

Declaration

func readLine(strippingNewline: Bool = true) -> String?

 

TIP

- Xcode Command Line Tool을 활용하면 readLine fucntion을 console창에 입력해 실행할 수 있다.
(1) solution 코드를 Run하고

(2) console 창에 "1 2" 값을 입력하고 (따옴표 없이 적어야 한다)

(3) enter를 치면 readLine 실행!

 

 

2. components(separatedBy:)

- 공식문서 developer.apple.com/documentation/foundation/nsstring/1413214-components

- Instance Method :: Returns an array containing substrings from the receiver that have been divided by a given separator.

- 주어진 구분 기호로 나눈 부분 문자열들을 포함한 배열을 반환합니다.

- Framework Foundation

 

Declaration

func components(separatedBy separator: String) -> [String]

 

3. map(_:)

- 공식문서 developer.apple.com/documentation/swift/array/3017522-map

- Generic Instance Method :: Returns an array containing the results of mapping the given closure over the sequence’s elements.

- 시퀀스의 요소들과 주어진 클로져를 맵핑한 결과가 포함된 배열을 반환합니다.

- Framework Swift Standard Library

 

Declaration

func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]

 

Discussion

let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map{ $0.lowercased() }
// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.count }
// 'letterCounts' == [6, 6, 3, 4]

 

 map function closure 과정 

 

// start

let lowercaseNames = cast.map({

  (cast: String) -> String in

  return cast.lowercased()

})

 

// step.1 반환값의 타입 생략 (컴파일러가 추론)

let lowercaseNames = cast.map({

  (cast: String) -> String in

  return cast.lowercased()

})

 

// step.2 매개변수의 타입 생략 (컴파일러가 추론)

let lowercaseNames = cast.map({

  (cast: String) in

  return cast.lowercased()

})

 

// step.3 매개변수 생략, 내부 상수 이용 (인자값의 순서대로 $0, $1)

let lowercaseNames = cast.map({

  cast in return cast.lowercased()

})

 

// step.4 실행구문(in) 생략

let lowercaseNames = cast.map({

  in return $0.lowercased()

})

 

// step.5 return 구문 생략 (컴파일러 추론)

let lowercaseNames = cast.map{

  return $0.lowercased()

}

 

// final

let lowercaseNames = cast.map{ $0.lowercased() }

 

4. reduce(_:_:)

- 공식문서 developer.apple.com/documentation/swift/array/2298686-reduce

- Generic Instance Method :: Returns the result of combining the elements of the sequence using the given closure.

- 주어진 클로져를 사용해 시퀀스의 요소들을 합친 결과를 반환한다.

- Framework Swift Standard Library

- Complexity: O(n), where n is the length of the sequence.

 

Declaration

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

 

Discussion

1) 클로져(Closure) 이용

let numbers = [1, 2, 3, 4]
let numberSum = numbers.reduce(0, { x, y in
    x + y
})
// numberSum == 10

 

2) 연산자 함수 (Operator Functions) 이용

클로저 표현식보다 더 간결하게 표현할 수 있는 방법. 연산자만을 사용하여 의미하는 바를 정확히 나타낼 수 있을 때 사용된다.

let numbers = [1, 2, 3, 4]
let numberSum = numbers.reduce(0, +)
// numberSum == 10

 

5. split(separator:maxSplits:omittingEmptySubsequences:)

- 공식문서 developer.apple.com/documentation/swift/string/2894564-split
- Instance Method :: Returns the longest possible subsequences of the collection, in order, around elements equal to the given element.

- 주어진 요소와 동일한 요소 주위의 컬렉션에서 가장 긴 하위 시퀀스를 순서대로 반환합니다.

- Framework Swift Standard Library

- Complexity: O(n), where n is the length of the collection.

 

Declaration

func split(separator: Character, maxSplits: Int = Int.max, omittingEmptySubsequences: Bool = true) -> [Substring]

 

Parameters

- separator

The element that should be split upon.

- maxSplits

The maximum number of times to split the collection, or one less than the number of subsequences to return. If maxSplits + 1 subsequences are returned, the last one is a suffix of the original collection containing the remaining elements. maxSplits must be greater than or equal to zero. The default value is Int.max.

- omittingEmptySubsequences

If false, an empty subsequence is returned in the result for each consecutive pair of separator elements in the collection and for each instance of separator at the start or end of the collection. If true, only nonempty subsequences are returned. The default value is true.

 

Discussion

The resulting array consists of at most maxSplits + 1 subsequences. Elements that are used to split the collection are not returned as part of any subsequence.

The following examples show the effects of the maxSplits and omittingEmptySubsequences parameters when splitting a string at each space character (” “). The first use of split returns each word that was originally separated by one or more spaces.

 

let line = "BLANCHE:   I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

 

The second example passes 1 for the maxSplits parameter, so the original string is split just once, into two new strings.

print(line.split(separator: " ", maxSplits: 1))
// Prints "["BLANCHE:", "  I don\'t want realism. I want magic!"]"

 

The final example passes false for the omittingEmptySubsequences parameter, so the returned array contains empty strings where spaces were repeated.

print(line.split(separator: " ", omittingEmptySubsequences: false))
// Prints "["BLANCHE:", "", "", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

 

반응형