본문 바로가기
Problem Solving/BOJ

백준 10993번 별 찍기 - 18 - 스위프트(Swift) 풀이 + 그림 설명

by 어멘드 2022. 1. 24.
반응형
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()

 

 

반응형

댓글