[백준으로 배우는 Swift] 별 찍기 - 2 (백준 2439번)
Updated:
시작하며
한동안 멈췄던 포스팅을 다시 시작하며 [백준 단계별 문제풀기 - for문] 에서 껄끄러웠던 문제 중 첫번째인 별찍기-2 문제를 풀어보도록 하겠다.
백준 2439번
간단해 보이지만 생각보다 손이 쉽게 가지 않는다. 별을 한개씩 늘려주면서 입력받은 N만큼 늘려주면 되지만 그 앞부분은 공백으로 채우고 맨 오른쪽 문자열에서부터 채워가야 한다.
let N = Int(readLine()!)!
var output = ""
// N을 입력받으면 N줄을 뽑도록 만듬
for i in 1...N {
// 공백이 먼저오고 별이 와야하기 때문에 (N-i)개의 공백을 먼저 입력
for _ in 0..<N-i {
output += " "
}
// (N-i)개의 공백이 온 후 i개의 * 입력
for _ in 0..<i {
output += "*"
}
// 한 줄 입력 후 줄바꿈
output += "\n"
}
print(output)
#=> if input N=5,
#=> prints *
#=> prints **
#=> prints ***
#=> prints ****
#=> prints *****
for문 내에 두 개의 for문을 넣어서 하나는 공백, 하나는 별(*)을 output변수에 입력하도록 구성했다.
(1) 첫번째 for문
- N을 입력받은 다음 N번 반복해서 output 변수에 문자열이 입력되도록 함
- 반복되는 지역변수(i)는 1부터 시작
(2) 두번째 for문
- output변수에 (N-i)개의 공백을 입력
Ex) N=5 일경우, 첫번째 사이클(i=1)에서는 공백 4개 입력(N-i = 4, 0..<4)
output = " "
(3) 세번째 for문
- output변수에 i개의 별을 입력
Ex) 두번째 for문에서의 4개의 공백에 이어서 별 한개를 입력
output = " *"
따라서 다음과 같이 한 줄당, N개의 문자가 들어가는데 첫번째줄에서 N-1개의 공백과 1개의 별부터 N-2개의 공백, 2개의 별…. 과 같은 식으로 마지막엔 N개의 별이 채워지게 된다.
그리고 반복적인 print문이 아닌 output
변수에 문자열을 할당한 후 한번에 출력한 이유는, swift에서의 print문은 다른 언어에 비해 속도가 느려 처리속도에 영향을 크게 준다. 따라서 print문의 사용을 최대한 줄이기 위해 변수를 만들어 한번에 출력하였다.
마무리
for문에서 순차적으로 반복되는 지역변수를 이용해서 문제를 풀어보았다. 한동안 백준문제 포스팅을 하지 않았는데, 앞으로는 위처럼 쉽게 풀리지 않는 문제들을 위주로 포스팅을 하도록 하겠다.