본문 바로가기
Apple/Swift

[Swift] 백준 스위프트로 풀기 - 프로젝트 생성, 입력 받는 법

by 어멘드 2022. 1. 5.
반응형

 iOS 공부를 시작한 뒤로 스위프트 외 다른 언어는 거의 다 까먹어버렸다😅 원래 PS 할 때는 C++을 써왔는데 지금 제일 편한 언어는 스위프트라 스위프트로 한번 해보려고 한다.

 

 

먼저 PS용 CLI 프로젝트부터 파주자.

New Project - Command Line Tool 선택

 

빈 칸 채우고 Language: Swift 선택

 

프로젝트 생성 완료

 

빌드해서 실행해보면 "Hello, World!"가 잘 출력된다

 

반응형

 

 이제 문제를 풀기 위해서는 주어진 입력을 받아야 한다.

 Swift에서 사용자 입력을 받는 함수는 readLine()이다.

 함수 설명은 "Returns a string read from standard input through the end of the current line or until EOF is reached"라고 되어 있다.

 함수 이름처럼 터미널에서는 한 줄(엔터 기준)을 읽어 들인다.

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

 

 주의해야할 점은 리턴 타입이 옵셔널이라는 것이다.

 실제 개발이라면 안전하게 옵셔널 바인딩을 해주어야겠지만 알고리즘 문제에선 입력이 잘못 들어오는 일은 없을 것이기 때문에 그냥 강제 언래핑을 해서 쓰는 편이다. 실제 사용 코드는 아래와 같다.

let input = readLine()!

 

 

 공식 문서에서 그냥 넘어간 부분이 있는데 함수 파라미터다.

 strippingNewline이라는 파라미터가 있는데 말 그대로 개행 문자를 떼어버릴 것인지 말 것인지를 결정해주는 부분이다.

 디폴트는 true이기 때문에 그냥 readLine()을 호출하면 엔터 전까지의 문자열이 리턴된다.

 문제 풀이에 엔터는 필요 없으므로 readLine()을 쓰면 된다. 아래는 각각 true와 false로 호출해본 결과이다.

 출력 차이를 보면 쉽게 이해할 수 있다.

 

 

 알고리즘 문제 상당수는 문자열이 아닌 숫자가 입력으로 주어지는데, 여러 개의 숫자가 한 줄에 공백으로 구분되어 주어지는 경우가 많다.

 아래와 같은 식으로 말이다. 이것을 배열로 저장하는 방법을 살펴보자.

100 98 70 19

 

 

 고차함수를 쓰면 코드가 간단해진다. 단계별로 변환 과정을 보면 아래와 같다.

// readLine()!
"100 98 70 19"

// readLine()!.split(separator: " ")
["100", "98", "70", "19"]

// readLine()!.split(separator: " ").map{ Int(String($0))! }
[100, 98, 70, 19]

  공백을 기준으로 문자열을 자르는 방법은 두 가지가 있는데, split(separator: " ")과 components(separatedBy: " ")다.

 입력이 길어지면 입력 처리 때문에 시간초과가 뜨는 경우가 많은데, components보다는 split이 빨라서 split을 쓰고 있다.

 (components 함수를 split으로 바꾸기만 해도 시간 초과가 해결되기도 한다.)

 map에서 String($0)처리를 한번 해주는 이유도 속도 때문이다. 바로 Int($0)로 변환하는 것보다 빠르다고 한다.

 

 

 1000번 A+B 문제를 푼 예시 코드이다. 

import Foundation

let arr = readLine()!.split(separator: " ").map{ Int(String($0))! }

let A = arr[0]
let B = arr[1]

print(A+B)

 

반응형

댓글