반응형
1. N-1 크기의 삼각형을 감싸고 있는 테두리 삼각형을 그린다.
2. 안쪽 중앙에 N-1 크기의 삼각형을 그린다.
3. N이 짝수일 때, 홀수일 때 모양을 구분해준다.
1. N-1 크기의 삼각형을 감싸고 있는 테두리 삼각형을 그린다.
출력 예시를 보고 규칙을 찾아보면, N일 때의 출력은 N-1일 때의 출력 결과를 품고 있는 삼각형이다. N=3일 때를 보면 안에 N=2일 때의 결과를 더 큰 삼각형이 감싸고 있다. 따라서 바깥 테두리 삼각형을 그린 뒤, 적절한 내부 위치를 찾아 재귀적으로 N-1 삼각형을 그리는 함수를 호출하면 된다. 2차원 배열을 선언해주고, 함수 파라미터에 그려야 하는 위치(행, 열)를 넘겨주면 재귀 호출로 내부의 원하는 위치에 그릴 수가 있다.
출력을 보고 규칙을 찾으면, N일 때 테두리 삼각형의 높이는 (2^N-1)이고, 밑변의 길이는 (높이x2 - 1)이다. 이것에 맞게 밑변과 두 빗변(?)을 잘 그려주면 된다. 인덱스 계산이 조금 귀찮은데, 계산만 잘하면 반복문을 짜면 쉽게 그릴 수 있다.
2. 안쪽 중앙에 N-1 크기의 삼각형을 그린다.
이제 안쪽 중앙에 N-1 크기의 작은 삼각형이 들어갈 위치를 계산해서, 그 위치에 대해 fillStar(row, col, size: N-1)을 호출해주면 된다. 기저 사례는 당연히 N=1일 때이다.
3. N이 짝수일 때, 홀수일 때 모양을 구분해준다.
짝수일 때와 홀수일 때 모양이 다르다. 짝수이면 역삼각형으로 출력해주어야 한다. 따라서 이 두 케이스를 구분해서 처리한다.
import Foundation
var arr = [[String]]()
func fillStar(row: Int, col: Int, size: Int) {
let base = base(of: size) // 밑변 길이
let height = height(of: size) // 높이
if size == 1 {
arr[row][col] = "*"
} else if size % 2 == 0 { // size가 짝수이면 역삼각형
for i in 0..<base { // 밑변
arr[row][col+i] = "*"
}
for i in 0..<height-1 { // 두 빗변
arr[row+i+1][col+i+1] = "*"
arr[row+i+1][col+base-i-2] = "*"
}
fillStar(row: row + 1, col: col + (height+1)/2, size: size-1) // 내부 size-1짜리 삼각형
} else { // size가 홀수이면 정(?)삼각형
for i in 0..<base { // 밑변
arr[row+height-1][col+i] = "*"
}
for i in 0..<height-1 { // 두 빗변
arr[row+height-i-2][col+i+1] = "*"
arr[row+height-i-2][col+base-i-2] = "*"
}
fillStar(row: row + height/2, col: col + (height+1)/2, size: size-1) // 내부 size-1짜리 삼각형
}
}
func height(of size: Int) -> Int {
return Int(pow(2.0, Float(size))) - 1
}
func base(of size: Int) -> Int {
return height(of: size) * 2 - 1
}
func solution() {
let N = Int(readLine()!)!
let height = height(of: N)
let base = base(of: N)
arr = Array(repeating: [String](), count: height)
for i in 0..<height {
if N % 2 == 0 {
arr[i] = Array(repeating: " ", count: base - i)
} else {
arr[i] = Array(repeating: " ", count: base/2+1+i)
}
}
fillStar(row: 0, col: 0, size: N)
arr.forEach{ print($0.joined()) }
}
solution()
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
백준 2718번 타일 채우기 - 스위프트(Swift) 풀이 + 그림 설명 (0) | 2022.01.25 |
---|---|
백준 11054번 가장 긴 바이토닉 부분 수열 - 스위프트(Swift) 풀이 + 그림 설명 (0) | 2022.01.25 |
백준 2448번 별 찍기 - 11 - 스위프트(Swift) 시간초과 해결 못함 (0) | 2022.01.24 |
백준 7511번 소셜 네트워킹 어플리케이션 - 스위프트(Swift) 시간초과 해결 (0) | 2022.01.24 |
백준 1043번 거짓말 - 스위프트(Swift) 풀이 (0) | 2022.01.24 |
댓글