[문풀] 콘솔에 입력받는법

Kiwi·2024년 4월 2일

Algorithm

목록 보기
11/17
post-thumbnail

⚙️ 직사각형 별찍기

해당 문제를 풀기위해 commandLine 파일에 옮겼다. (플레이그라운드에서는 readLine()이 실행이 안된다!!)


처음 문제 풀기 전에 답안 영역에 이렇게 작성되어 있는데 readLine()이라는 함수를 사용해본적이 없었다. 함수로 별을 찍는 것은 for문을 통해 단순하게 구현했다. 다만 한줄에 별을 찍고 다음 줄로 넘어가는 것을 구현하려고 할때 처음에는 print("\n")처럼 개행문자를 프린트하려고 했으나 이러면 두줄이 띄어지게 되어 print("")로 하게 되었다. print()함수가 인자를 출력한 후 줄바꿈문자를 출력한다는 사실을 이용했다.

let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! }
let (a, b) = (n[0], n[1])
for _ in 1...b {
    for _ in 1...a {
        print("*", terminator: "")
    }
    print("")
}

📖 readLine()

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

apple 공식문서에 이 함수의 원형이 나타나있다. 일단 이 함수는 어떤 입력을 받던 String?타입으로 반환한다. 예시를 보면

var a = readLine()
print(a)

를 실행하고 a를 입력하면 출력은 Optional("a")이다. 그렇기 때문에 String값을 얻으려면 강제해제 해주거나 readLine()! 암묵적으로 해제해주면 된다.
그리고 이 함수는 입력의 끝을 개행문자로 인식한다. 즉 한줄씩 입력 받는다. 위의 함수에 입력을

a b c
d e

로 하면 d e가 입력되기 전에 종료되면 결과는 Optional("a b c")이다.

그렇다면 문제의 예시처럼 공백이 있는 입력값을 받아 공백을 제외하고 처리하려면 어떻게 해야할까? 문제에서 미리 예시를 주었듯이 고차함수를 활용하면 된다.

let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! }

먼저 사용자로부터 입력을 한 줄로 읽어드리고, 옵셔널을 강제로 해제한다. 그런다음 .components(separatedBy: [" "])를 통해 문자열을 공백을 기준으로 나누어 문자열 배열로 만든다. 그 후 map { Int($0)! } 로 문자열 배열의 각 요소를 정수로 반환한다.

정리하자면

  • readLine()함수는 한줄씩 입력받고 반환값은 String!
profile
🐣 iOS Developer

0개의 댓글