2292번 - 벌집
<코드 작성>
변수 cnt는 방의 번호, 변수 end는 cnt번방에 들어갈 수 있는 최대 숫자가 대입된다.
변수 num은 end의 범위를 증가시키기 위함이다.
end를 1로 초기화(N==1 경우 무조건 1번 방이기 때문)하고, for문을 통해 end에 (6 * i)를 더해준다.
입력받은 N이 end를 넘지 않을 경우 cnt = 1 + i를 통해 방 번호를 저장하고 반복문을 종료한다.
입력받은 N이 end보다 클 경우 num += 2를 통해 end의 범위를 증가시킨다.
1번 방 : 1 (end1 = 1 + 6 * 0 = 1)
2번 방 : 2 ~ 7 (end2 = end1 + 6 * 1 = 7)
3번 방 : 8 ~ 19 (end3 = end2 + 6 * 2 = 19)
4번 방 : 20 ~ 37 (end4 = end3 + 6 * 3 = 37)
5번 방 : 38 ~ 61 (end5 = end4 + 6 * 4 = 61)
6번 방 : 61 ~...
#include <iostream>
using namespace std;
int main() {
int N;
cin >> N;
int cnt = 1, num = 0, end = 0;
if (N == 1) cout << cnt; //N이 1일경우 1번방
else { //N > 1일 경우
num = 1; end = 1; //num: end의 범위를 결정할 때 사용, end: 방 번호를 결정할 때 사용
for (int i = 1; i <= num; i++) {
end += (6 * i);
if (N <= end) {
cnt = 1 + i;
break;
}
else num += 2;
}
cout << cnt;
}
return 0;
}
입력받은 N이 end를 기준으로 방 번호가 나뉘고 end의 범위가 증가하는 규칙을 찾으면 해결할 수 있는 문제라고 생각합니다.
조금 더 생각해보면 변수 하나 정도는 덜 사용하고 문제를 풀 수 있을 것 같지만 당장은 생각이 나지 않아 이후에 해결할 경우 수정하여 코드를 추가하겠습니다.
2775번 - 부녀회장이 될 테야
<코드 작성>
ex) k = 2, n = 3
-> (k = 1 n = 1) + (k = 1 n = 2) + (k = 1 n = 3)
-> (k = 0 n = 1) + (k = 0 n = 2 + k = 0 n = 1) + (k = 0 n = 3 + k = 0 n = 2 + k = 0 n = 1)
-> (k=0 n=1) * 3 + (k=0 n=2) * 2 + (k=0 n=3) * 1 = 3 + 4 + 3 = 10
=> 결론 : 재귀함수 사용!
몇층(k)을 입력받던 무조건 0층으로 돌아가 사람 수를 카운트 해야하기에 재귀함수를 사용(getNum).
n이 1일 경우 1을 반환하고, k가 0일 경우 n을 반환한다.
그리고 앞의 두 경우가 아닐 경우는 재귀함수를 호출(getNum(k -1, n) + getNum(k, n - 1))한다.
#include <iostream>
using namespace std;
//1층 3호 -> 0층 1호: 1명, 0층 2호: 2명, 0층 3호: 3명 => 총 6명
//2층 3호 -> 1층 1호 : 1명, 1층 2호: 3(1+2)명, 1층 3호: 6(1+2+3)명 => 총 10명
//3층 3호 -> 2층 1호 : 1명, 2층 2호: 4(1+(1+2))명, 2층 3호: 10(1+(1+2)+(1+2+3))명 => 총 15명
int getNum(int k, int n) { //재귀함수
if (n == 1) return 1;
if (k == 0) return n;
return getNum(k - 1, n) + getNum(k, n - 1);
}
int main() {
int T;
cin >> T;
int k, n;
for (int i = 0; i < T; i++) {
cin >> k >> n;
cout << getNum(k, n) << '\n';
}
return 0;
}
getNum함수의 return 값을 구할 때, 정확한 규칙성을 찾기 어려워 getNum(k - 1, n)만 return 값으로 두고 고민을 했습니다.
감사합니다!
2022.02.19
'Baekjoon' 카테고리의 다른 글
[백준 Java] 10808번 - 알파벳 개수 (0) | 2022.08.02 |
---|---|
[백준 C++] 11651번, 10814번 (정렬) (0) | 2022.03.04 |
[백준 C++] 1065번 - 한수 (0) | 2022.02.19 |
[백준 C++] 4344번 - 평균은 넘겠지 (0) | 2022.02.17 |
[백준 C++] 4949번 - 균형잡힌 세상 (0) | 2022.02.07 |