[Swift] 스위프트 입출력 설정하기.

정환우·2021년 6월 30일
0

iOS

목록 보기
23/24
post-thumbnail

오늘은 input, output에 관해서 정리를 해보자.

되게 쉬운 거지만, 코딩 테스트의 아주 기초가 되는 것이고, 가장 어려운 파트이기도 하니까.

입력

일단 입력은 PlayGround에서 불가능하고, Command Line Tool로 Project를 생성해 주어야 한다.
PlayGround는 Sandbox이기 때문에 Command Line Input에 접근할 수 없다고 한다.
출처 - tornbolo.log

입력 받는 방법은 2가지가 있다고 하는데, readline이라는 편한 함수를 놔두고 굳이 다른걸..? 사용 할 필요가 없으므로 그냥 readline만 다루기로 하자.

readline()

공부의 시작은 공식 문서! 애플 공식 문서를 먼저 봐보면,

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

이렇게 정의를 해두었고, parameter인 strippingNewline에 관해서는

strippingNewline

If true, newline characters and character combinations are stripped from the result; otherwise, newline characters or character combinations are preserved. The default is true.

이게 무슨 소리인가 하면, true이면 개행문자와 문자 조합이 결과에서 제외되고, false이면 유지된다고 한다. 기본값은 true이다.
그니까 코딩테스트에서는 false를 쓸 일이 없으므로 그냥 기본값으로 계속 사용하면 된다는 뜻인 것 같다.

return 값

중요한게 return 값이 있는데, return 값이 String?, 즉 Optional 값이므로 Forced Unwrapping이든 Optional Binding이든 뭔가를 사용해서 값을 추출해야 한다.
사실 코딩테스트면 nil 값이 아닌게 99% 보장이 되기 때문에 Forced Unwrapping을 사용해도 무방할 것이라고 생각이 들지만, 실제 프로그램을 짤 때도 그렇고 혹시 모를 오류가 발생할 경우를 대비해 Optional Binding을 사용하는게 맞는 것 같다.

그리고 또 하나 중요한 것은 코테에서는 문자열만큼 숫자도 많이 다루는데 숫자를 다룰 때는 python에서처럼 mapping을 해서 형변환을 해줘야 한다.
기본값이 String이기 때문에!

예시

이제 예시를 직접 살펴보자. 입력을 구현하는 방법은 진짜 엄청 많은 경우가 있는데, 백준에서 많이 푸는 경우로 살펴보면 막

1 2 3 4 5

이런식으로 입력이 들어오는 때가 있다.
이걸 만약 int형 문자열에 넣고 싶다면, 생각나는 방법은 2가지가 있다.

1. 공백을 구분자로 넣어서 배열에 하나씩 넣어주기

import Foundation


var a = readLine();


if let a = a {

    var array = a.components(separatedBy: " ")


}


// 출처: https://zeddios.tistory.com/68 [ZeddiOS]

components를 사용하면 공백을 구분해서 array에 하나 씩 넣어준다.
여기서 신기한건 array를 따로 배열이라고 선언하지도 않았는데도 바로 배열로 선언이 된다. 이것이 swift...!

장점은 사용하기 쉽고, 단점은 import Foundation이 필수다. 저기에 속한 instance method 이기 때문.

2. Array에 바로 mapping해서 넣어주기

let input = Array(readLine()!).map { Int(String($0))! }

이건 Force Unwrapping을 해준 건데, 이 방식을 사용하려면 무조건 해줘야 한다. 옵셔널 값은 mapping이 안되기 때문.
이렇게 하면 input이라는 array에 Int값만 들어간다. $0 이거는 저번에 Closure 다룰 때 다루었던 것 같다. 원소들 나타내는 것.
외우기 어렵지만 간편해 보인다.

출력

출력은 되게 간단하다.

print()

공식 문서를 먼저 보자! 기본형은

func print(_ items: Any..., separator: String = " ", terminator: String = "\n")

대충 느낌이 오지 않는가? parameter에 대한 설명은

items
Zero or more items to print.

separator
A string to print between each item. The default is a single space (" ").

terminator
The string to print after all items have been printed. The default is a newline ("\n").

item은 뭐 이제 출력할 것들. print(1, 2, 3) 이런식으로 출력이 가능하다. 굉장히 편리하다.

seperator는 아이템들 사이에 들어갈 문자다. 기본 값은 공백 문자.
여기까진 굉장히 편리한데...

terminator 이게 중요하다. 이게 이제 item들 출력이 다 끝나면 끝에 들어가는 문자인데, 기본값이 개행문자다. 이게 왜 문제냐면, DP문제같은거 풀 때 재귀로 출력할 때, 개행문자가 들어가면 안되는데 그냥 print("뭐시기뭐시기") 만 쓰면 무조건 개행이 되어버려 출력이 달라진다.

c++ 이나 파이썬처럼 개행문자를 따로 안써도 되는 장점대신에 개행문자를 안 쓸때는 번거로워지는 단점..

print(뭐시기뭐시기,terminator: "") 이런식으로 사용하면 다른 언어에서 사용하는(ex : c++의 cout) 처럼 사용이 된다. 이거야 뭐 크게 어렵지 않다.

swift에서 입력받는 것에 대해서 공부를 많이해야 할 것 같다.

번외 : 2차원 배열

코딩테스트 문제를 풀다보면 2차원 배열의 사용이 필요할 때가 있는데, 2차원 배열 선언 방법이 되게 독특하다.

var video: [[Int]] = Array(repeating: Array(repeating: -1, count: 64), count: 64)

이게 reapeating은 기본 Array 선언할 때 넣을 수 있는 인자들인데, 이걸 중첩을하면 2차원 배열이 만들어진다.

이 코드는 결국 int video[64][64]가 선언이 된거고 그 값들이 -1로 초기화가 된 것이다.

memset 같은거 안써도 되서 나름 편한듯?하다

0개의 댓글