안녕하세요! 정말 오랜만에 글을 쓰는데,
딱 1년 전, 살짝 공부했던 Problem Solving.. 을 다시 공부해보려다가,
예전에 했던 개념은 Swift로 해보며 부족하다고 느꼈던 Swift에 대한 이해도도 늘려봄이 어떨까해서
쉬운 개념이겠지만 하나하나 글을 적어보려 합니다.
PS에서 가장 기본이지만, iOS 개발을 하다 보면 console에서 input을 받을 일은 없었기에
input 받기부터 난관이었는데, 이것부터 정리해보며 하나하나 시작해보겠습니다! 파이팅
input 받는 방법
readLine() 이라는 메서드를 사용하여 조건을 입력받습니다.
let input = readLine()
이렇게요. 하지만,
이렇게 볼 수 있듯이, optional형 String을 return하기 때문에, unwrapping이 필수적입니다.
입력이 문자열일 때
input이 문자열인 상황입니다.
readLine으로 입력을 받고, 이의 type을 출력해보면 당연히 Optional<String> 이라고 출력이 됩니다.
let input = readLine()
print(type(of: input)) //Optional<String>
그럼, 아래 방법처럼 언래핑을 해주거나
let input = readLine()
let unwrapped = input!
print(type(of: unwrapped)) //String
아래의 방법처럼 아예 입력과 동시에 강제언래핑하여 값을 담아주는 방법이 있겠습니다.
let input = readLine()!
print(type(of: input)) //String
둘 다 String으로 원하던 바가 잘 출력되지만, 굳이 변수 하나 더 안쓰는 아래의 방법을 더 선호하게 될 것 같습니다.
입력이 정수일 때
정수를 입력받아서 사용해야 하는데, readLine()! 을 해주면 String입니다.
자연스레 이를 공백(white space)을 기준으로 split 해야겠다는 생각이 들었습니다.
그 때 필요한 것이 바로,
이 메서드입니다. (import Foundation 이 필수적입니다.)
String의 배열을 return 해주고 있습니다.
입력으로 1 2 라고 입력한 상황을 가정해보면, 현재 "1 2"라는 String을 ["1","2"] 로 바꿔 저장해주겠네요.
근데 우리는 Integer가 필요합니다.
이를 또 하나하나 type casting 해줘야겠네요.
그 때 필요한 메서드가 바로
map 입니다. closure에 들어있는 제조 과정을 거쳐 나온 값이 담기게 될 것 입니다.
이의 예시는 아래 문제를 풀어 확인해보겠습니다!
가장 간단한 입출력 문제, 백준 온라인 저지의 1000번 A+B를 풀어 확인해보겠습니다.
import Foundation
let input = readLine()!.components(separatedBy: " ").map { Int($0)! }
print(input[0] + input[1])
Optional<String>을 읽어옴과 동시에 강제 언래핑 -> 공백을 기준으로 문자열 나누기 -> 나눈 요소 하나하나에 대해 Int로 casting
+) map을 하는 과정에서 강제 언래핑을 한 번 더 해준 이유는,
String을 Integer로 강제 casting 해줄 수 없는 경우 ( Int("a") ) 에는 nil을 반환할 것입니다.
let input = readLine()!.components(separatedBy: " ")
print(type(of: Int(input[0]))) //Optional<Int>
실제로 1 2를 입력해도, 강제언래핑을 해주지 않으면 casting의 결과는 optional형 int인 것을 볼 수 있네요.
그래서 이 과정에서도 또 강제 언래핑을 해주게 되었습니다!
앱을 개발할 때, nil이 아닐 것이라고 확신할 수 있는 상황이 드물기 때문에, 강제언래핑을 의식적으로 지양했었는데,
PS 문제 같은 경우, 입력에서 예외의 경우가 없기 때문에 편의를 위해 강제 언래핑을 사용해도 괜찮을 것 같습니다.
(언제 이 생각을 반성하게 될지 모르겠지만)
C++이 얼마나 PS에 최적의 언어인지 딱 한 문제 풀자마자 깨달았습니다.
끝-!