본문 바로가기
iOS/애플 개발자 공식 문서

[Swift] 백준에서 readLine() 메서드로 입력 받기

by Dev.Andy 2023. 3. 16.

백준에서 Swift 언어로 문제를 풀 때, 입력을 어떻게 받아야 할까? Swift의 표준 입력 함수 readLine()에 대해 알아보자. 주어진 조건(띄어쓰기 여부 등)에 따라 입력 받은 문자열을 어떠한 자료형으로 변환할지 알아 보자.

 

📌 요약

이후 설명은 아래의 개발자 공식 문서에서 직접 번역했다.

readline(strippingNewline:) | Apple Developer Documentation

readLine(strippingNewline:)

Returns a string read from standard input through the end of the current line or until EOF is reached.
현재의 줄 끝까지 또는 EOF와 마주할 때까지 표준 입력으로부터 문자열을 반환한다.

요약하면, 표준 입력을 받아서 "문자열"로 반환하는 입력 함수이다. 그에 대한 조건은 주어진 값의 한 줄 끝('\n')까지 혹은 EOF 직전까지이다.

 

📌 선언(Declaration)

함수 readline()은 매개변수로 strippingNewline을 입력 받고, Optional String을 출력하는 형태이다.

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

여기서 주목해야 할 두 가지는 아래와 같다.

  1. newline을 strip한다.
  2. 반환값이 String이 아닌 Optional String이다.

 

📌 매개변수(Parameters)

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일 경우, 결괏값에서 새줄 문자와 문자의 조합을 제거한다; 그렇지 않을 경우, 새줄 문자나 문자의 조합은 유지된다. 기본값은 true이다.

strip'(옷을) 벗다[벗기다]', '(기계 등을) 분해[해체]하다'라는 뜻의 단어로, 매개변수로 주어진 문자열에서 newline('\n', 새줄 문자)와, 문자 사이의 조합을 제거한다.

 

말이 어려운데, 새줄 문자('\n)만 제거된다는 뜻이다. 실제로 값을 넣으면 다음과 같다.

import Foundation

// 함수 readLine()으로 입력 받은 반환값을 변수 input에 할당
// readLine()에서 새줄 문자('\n')을 제외한 남은 옵셔널 문자열을 변환
let input = readLine() // "Andy Archive\n" -> "Andy Archive"

// input의 값을 화면 출력
print(input) // Optional("Andy Archive")

// input의 자료형을 화면 출력
print(type(of: input)) // Optional<String>
  1. 사용자가 입력을 할 때 엔터(새줄 문자)를 치므로, "Andy Archive\n"가 입력될 것이다.
  2. readLine()에서는 여기서 '\n'을 제거한 "Andy Archive"를 반환한다.
  3. 단, 반환하는 자료형이 일반적인 String이 아닌 Optional<String>이다.

 

📌 3. 반환값(Return Value)

The string of characters read from standard input. If EOF has already been reached when readline() is called, the result is nil.
(반환값은) 표준 입력으로부터 읽은 문자열이다. readline() 함수가 호출되는 동안 EOF 결괏값은 nil이다.

 

📌 EOF?

그렇다면 EOF는 무엇인가?

In computing, end-of-file (EOF) is a condition in a computer operating system where no more data can be read from a data source. The data source is usually called a file or stream.

EOF(end-of-file)이란, 컴퓨터 운영체제에서 데이터 소스로부터 읽을 수 있는 데이터가 더 이상 남아 있지 않는 상태를 말한다. 여기서 말하는 데이터 소스는 일반적으로 파일 혹은 스트림을 말한다.

요약하면, 말 그대로 '파일의 끝'을 알리는 상태이다.

 

 

📌 문자열(String)로 반환하기

한 줄에 하나의 문자열 → 하나의 문자열

readLine()의 반환값의 자료형이 Optional String이기에, !를 사용하여 optionalunwrap 해주어야 한다.

let inputToString = readLine()!
import Foundation

// 1. readLine()을 사용해 표준 입력을 받은 Optional String을 반환
// 2. !를 사용해 Optional String을 String으로 unwrap
let inputToString = readLine()! // "Andy is the best!\n"

// inputToString의 값을 화면 출력
print(inputToString) // "Andy is the best!"

// inputToString의 자료형을 화면 출력
print(type(of: inputToString)) // String

 

 

📌 정수형(Int)으로 반환하기

1. 한 줄에 하나의 문자열 → 하나의 정수

문자열에서 Int()를 이용하여 정수형으로 변환하면 된다.

단, Int() 역시 Optional 타입으로 반환하기에, !를 사용하여 optional unwrap을 한 번 더 해주어야 한다.

let inputToInt = Int(readLine()!)!
import Foundation

// 1. readLine()!을 사용해 표준 입력을 받은 Optional String을 unwrap
// 2. !를 사용해 Optional String을 String으로 unwrap
// 3. Int()를 사용하여 String을 Optional Int로 변환
// 4. !를 사용해 Optional Int을 Int로 unwrap
let inputToInt = Int(readLine()!)! // 123

// inputToInt의 값을 화면 출력
print(inputToInt) // 123

// inputToInt의 자료형을 화면 출력
print(type(of: inputToInt)) // Int

 

2. 한 줄에 여러 개의 문자열 (띄어쓰기 O) → 여러 개의 정수를 요소로 갖는 하나의 배열

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

 

📌 배열(Array)로 반환

1. 한 줄에 하나의 문자열 → 문자열의 문자 하나하나를 요소로 갖는 하나의 배열

components() 메서드는 Foundation이 선언되어야 사용 가능하다.

 

import Foundation

let inputToArrayOfString = readLine()!.components(separatedBy: " ")

댓글