#2447 별 찍기 - 10
# 문제
# 입력 및 출력
# 풀이
안그래도 재귀문제 못푸는데 진짜 너무 어려웠다,,
저번에 한 번 시도했던 문젠데 그때도 어려워서 포기했었는데
이번에도 결국 포기하고 공부하는 마음으로 코드를 찾아봤다ㅋㅋ
일단 ***를 한 묶음으로 볼 지 *를 따로 볼 지가 제일 헷갈렸다
*와 공백을 최소 단위로 할지 N=3일때 출력을 최소 단위로 할지 어느게 맞는지 몰라서,,,
아무튼 찾아보니까 한 묶음으로 보는게 아니라 *를 최소 단위로 생각하고 풀면 된다
아래 블로그 참고했음
https://codesyun.tistory.com/75
[BOJ / 백준] 2447번 별 찍기 - 10 C++ 문제 풀이
단계별로 풀어보기 - 재귀 단계 - [3단계] 2447번 문제 문제 링크 : www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크..
codesyun.tistory.com
#include <iostream>
using namespace std;
void star(int i, int j, int n) {
if ((i / n) % 3 == 1 && (j / n) % 3 == 1) cout << " ";
else if (n / 3 == 0) cout << "*";
else star(i, j, n / 3);
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
star(i, j, n / 3);
}
cout << "\n";
}
}
위에 블로그에서 궁금했던 점이 왜 main에서 호출할 때 n을 넘겨주는 것인지가 궁금했다
1) 만약에 n이 9라면 i, j는 0~8까지의 수로 어처피 /n하면 0이 되어
star함수에서 첫번째 조건문은 확인하지 않기 때문이다
2) 그리고 n이 가장 작은 값인 3이라고 해도 n/3은 항상 0보다 크기때문에
star 함수의 첫번째 호출에선 두번째 조건문을 확인할 필요가 없음
따라서 굳이 main에서 n을 넘겨주기보단 시간적인 측면에서 쓸데없는 부분을 없애기 위해 n/3으로 넘겨주었음
코드를 분석하자면 빈칸이 되는 위치는 인덱스를 3으로 나눴을 때 나머지가 1이 되는 부분이기 때문에
해당 조건을 만족하면 공백을 출력하도록 함
계속해서 n을 /3해주기 때문에 n이 3보다 작아지면 더이상 확인할 필요도 없이 *이기 때문에 *를 출력해줌
main에서 보자면 N*N 크기의 사각형의 모든 자리를 하나씩 확인하는 코드임
따라서 자리 인덱스 값인 i, j값을 매개변수로 넘겨줘서 확인함
코드 자체는 매우 간단한데 생각해내기가 정말 어렵다,,
재귀가 제일 어려운것같다ㅠㅠ
재귀 문제 진짜 많이 풀어봐야지,,
북마크 해뒀으니까 다음에 다시 풀어봐야겠다