직사각형 별찍기

obtusa·2022년 5월 9일
0

흔히 볼 수 있는 직사각형 별찍기이다. 반복문과 출력을 어떻게 하는지에 대한 지식을 묻는 테스트이다.

제시된 코드는 다음과 같다.

import Foundation

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

나의 공부를 위해 이 글을 작성하므로 알고리즘을 공부하면서 처음 본것은 정리하면서 쓰려고 한다. 사실 제시된 코드는 저게 아닐텐데 예전에 풀었던 문제였는지 나는 저렇게 나와있었다.

먼저 Foundation부터 알아보자

import Foundation

공식사이트의 소개를 정리하면 파운데이션 프레임워크는 데이터 저장 및 지속성, 텍스트 처리, 날짜 및 시간 계산, 정렬 및 필터링, 네트워킹을 포함한 앱 및 프레임워크의 기본 기능 계층을 제공하는 앱이다.

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

코드를 보면 직관적으로 콘솔에서 데이터를 입력받아 상수 n에 저장한다고 추측된다. 하지만 다소 복잡한 형태라 당황했다. 일단 readLine 함수 자체는 현재 줄의 끝이나 EOF에 도달할때까지의 입력을 받고 이를 문자열의 형태로 반환하는 함수이다.

이어서 등장하는 !는 옵셔널 타입을 의미하는 기호이다. 옵셔널 타입은 스위프트가 가진 독특한 개념이다. 옵셔널 타입은 값이 할당되지 않는 상황을 안전하게 처리하기 위해 존재한다. 옵셔널에 값을 할당하면 해당 변수나 상수는 래핑(wrapped)되었다고 표현된다. 래핑된 값은 추출과정을 거쳐야 다른 언어에서 사용하듯이 사용이 가능하다. 추출과정은 강제 언래핑(forced unwrapping)과 옵셔널 바인딩(optional binding)이 있다. 이 경우 !을 이용한 강제 언래핑으로 옵셔널을 벗겨 사용한다.

components(separatedBy:[" "])는 띄어쓰기를 기준으로 요소를 구분하여 받을 때 사용한다.

map {Int($0)!}는 입력된 요소를 Int로 지정하여 입력하게 한다.

이렇게 변수를 입력받으면 for문을 이용하여 출력하면 된다.

for i in 1...b {
    print(String(repeating: "*", count: a))
}

for문은 좀 독특하다. 1...b로 변수 b까지 반복을 한다. 기존 for문과는 다른 느낌인거 같다. print 함수에서 string으로 *을 a만큼 반복하여 출력한다.

profile
특이한 것만 골라서 합니다

0개의 댓글