[Swift] 반복문을 사용해서 별찍기(feat. stride)

Logan·2020년 10월 15일
2
post-thumbnail

for in 반복문

for in반복문을 사용하면 지정된 횟수만큼 코드를 반복하거나 컬렉션을 열거해 요소에 접근할 수 있습니다.

for loopConstant in Range {
	statements
}

for키워드 뒤에 사용할 반복상수이름를 적고, in키워드 뒤에 반복할 범위를 적습니다.
Range에 1부터 5까지 범위를 전달한다고 가정하면, 1을 반복할 경우 1이 반복 상수로 전달되고 계속해서 2,3...5를 반복할 경우 5가 반복 상수로 전달이 됩니다.
반복 변수가 아니라 반복'상수'이기 때문에 반복문 내에선, 값을 변경할 수 없습니다.

현재 회차에서 해당하는 값을 반복상수로 전달하고 이어지는 블록의 코드를 반복적으로(범위 내 순차적으로) 실행합니다.

for i in 1...5 {
    print(i)
}

이렇게 하면 print() 함수를 다섯번 호출하지 않아도 됩니다.


응용

방법 1
for in반복문을 활용하면 다양한 방법으로 한개씩 증가하는 별도 만들 수 있습니다.
여기서 별은 별표(Asterisk)

for num in 1...10 {
    for _ in 1...num {
        print("*", terminator: "")
    }
    print()
}

//*
//**
//***
//****
//*****
//******
//*******
//********

반복문 안에 다시 반복문을 만들고, 안에 있는 for in반복문 범위의 UpperBound는 밖에 있는 반복문의 반복 상수로 정했습니다.
만약 밖에 있는 반복문의 반복상수가 2인 경우, 안에 있는 반복문의 범위는 1...2까지가 되고 해당 코드블럭의 print("*", terminator: "")함수가 두 번 호출됩니다.

print함수의 terminator 파라미터는 기본값이 줄바꿈으로 선언되어 있습니다.
terminator 파라미터에 줄바꿈 대신, "" 빈 문자열로 값을 전달했습니다.
그러면 원하는대로 별표 두개를 연달아서 **이렇게 표시할 수 있습니다.

내부에 있는 반복문이 종료되면, 외부의 반복문에서 print()함수를 호출해 줄바꿈을 해주고, 다음 반복을 진행합니다.


방법 2

var asterisks = ""
for _ in 1...10 {
    asterisks += "*"
    print(asterisks)
}

빈 문자열을 생성한 다음, 반복문이 실행될 때 별표를 하나 추가하고 print()함수를 한 번 호출하는 식으로 UpperBound까지 반복합니다.


방법 3

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

print()함수에 문자열 생성자 String()를 사용해 전달된 반복상수만큼 별을 찍어낼 수 있습니다. 결과는 위와 같습니다.


별찍기

위에 별만들기 예제들을 응용해서 readLine()을 이해하고 키보드의 입력을 받을 수 있는 Xcode의 Command Line Tool을 사용하면서 프로그래머스 별찍기 문제를 풀 수 있습니다.


문제 설명
이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.


문제 설명 중 핵심이 되는 문장은 가로의 길이가 n, 세로의 길이가 m 부분인데,

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

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

a는 첫번째 입력받을 정수, b는 두번째 입력받을 정수입니다.
a엔 가로의 길이를 전달하면 되고, b엔 세로의 길이를 전달하면 되는데,
a는 별표의 갯수, b는 줄의 갯수(반복해야 하는 횟수)로 이해하면, 반복문을 응용해서 문제를 해결할 수 있습니다.


TIP

for in 반복문 내부에서 반복 상수를 사용하지 않을 경우, _ 문자로 생략할 수 있습니다. 이런 패턴을 wildcard pattern이라고 합니다.

for in반복문에서 in키워드 뒤에 stride(from:to:by:) 함수를 사용하면 from부터 to까지 by씩 증가하는 범위를 전달할수도 있습니다. 여기서 to에 전달된 수는 범위에 포함이 되지 않기 때문에 주의해야합니다.

for i in stride(from: 1, to: 9, by: 2) {
    print(i, terminator: “ “)
}

// Prints: 1 3 5 7

stride(from:to:by:)함수를 사용해 1부터 9까지 2씩 증가하는 범위를 전달했습니다.
to에 전달된 9는 실제 범위에 포함되지 않기 때문에 1 3 5 7만 출력됩니다.

profile
iOS개발자 꿈나무

0개의 댓글