문제
https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
풀이
이 문제는 재귀를 사용해서 별을 찍는 패턴을 찾아 별을 찍어주는 문제입니다.
n이 3일때, 9일때, 27일때를 한번 비교해봅시다.
- n이 3일때
첫번째 줄에서는 "*"이 3개
두번째 줄에서는 "*" 1개, " " 1개, "*" 1개
세번째 줄은 첫번째 줄과 동일합니다.
- n이 9일때
9줄을 3등분 해서 확인해봅시다.
1 ~ 3번째 줄은 n이 3일때 찍히는 패턴이 3번
4 ~ 6번째 줄은 n이 3일때 찍히는 패턴 1 + 공백 + n이 3일때 찍히는 패턴 1
7 ~ 9번째 줄은 1 ~ 3번째 줄과 동일합니다.
- n이 27일때
n이 9일때의 패턴이 반복해서 나타나고, 가운데는 공백으로 비워져 있습니다.
이것을 재귀함수로 어떻게 나타낼 수 있을까요?
맨 처음 n이 3일때의 패턴은 ["*"] 이 될 것입니다.
n이 9일때는? ["*", "* *", "*"]이 되겠죠?
n이 27일때는? ["*********", "* ** ** *", "*********", "*** ***", "* * * *", "*** ***", "*********", "* ** ** *", "*********"]가 될 것입니다.
이것을 코드로 나타내면 다음과 같습니다.
소스코드
let n = Int(readLine()!)! | |
func drawStar(n: Int, pattern: [String]) { | |
if n == 1 { | |
pattern.forEach { | |
print($0) | |
} | |
return | |
} | |
let starLine = pattern.map { 0+0 + $0 } | |
let emptyLine = pattern.map { 0+String(repeating:"",count:0.count) + $0 } | |
drawStar(n: n / 3, pattern: starLine + emptyLine + starLine) | |
} | |
drawStar(n: n, pattern: ["*"]) |
후기
맨 처음 문제를 풀 때 너무 어려웠습니다..
패턴을 찾는것 까지는 해결했는데, 재귀함수로 어떻게 호출해야 할 지 애먹었던 문제입니다.
다른 분들의 풀이를 보고 이해할 수 있었습니다...
재귀를 연습해야할듯....😂
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 1934 최소공배수 (Swift) (0) | 2023.03.15 |
---|---|
[BOJ] 백준 11729 하노이 탑 이동 순서 (Swift) (0) | 2023.03.15 |
[BOJ] 백준 24060 알고리즘 수업 - 병합 정렬 1 (Swift) (0) | 2023.03.14 |
[BOJ] 백준 25501 재귀의 귀재 (Swift) (0) | 2023.03.14 |
[BOJ] 백준 10870 피보나치 수 5 (Swift) (0) | 2023.03.14 |