https://codeup.kr/problem.php?id=1920
스터디에서 다같이 풀기로 한 문제여서 처음으로 Code Up에서 풀어봤다
반복문 제한이 걸려있어서 재귀함수라고 생각이 들었고,
결과적으로도 재귀함수를 이용하여 풀 수 있었다.
부끄럽지만 2진수에 대해서는 맨날 헷갈렸는데,
프로그램으로 구현하면서 다시 한 번 제대로 알 수 있었다.
이번에도 간단하지만 스케치를 했다.
매번 계획이 중요한 걸 알면서도 문제 앞에만 앉으면
바로 코딩이 하고 싶다..!
내가 잘할 수 있을 거란 자신감보다는
'내가 못풀면 어쩌지'라는 마음에 조급해져서 그런 것 같다ㅠ
그래도 차분히 문제를 읽어보면서 계획 스케치를 하는 게 낫다 훨씬..
#include <iostream>
#include <stack>
using namespace std;
int ConvertToBinary(int n, stack<int>& stc)
{
if(n == 0)
{
return 0;
}
else
{
stc.push(n % 2);
return ConvertToBinary(n/2, stc);
}
}
void PrintStack(stack<int>& stc)
{
if(stc.empty())
return;
else
{
cout<<stc.top();
stc.pop();
PrintStack(stc);
}
}
int main(void)
{
int n = 0;
cin>>n;
if(n == 0)
{
cout<<0<<endl;
return 0;
}
stack<int> binaryStack;
ConvertToBinary(n, binaryStack);
PrintStack(binaryStack);
cout<<endl;
return 0;
}
1. 재귀함수 종료조건
재귀함수에서 종료조건은 필수이다!
ConvertToBinary() 에서의 종료조건도 처음 계획대로 input이 0일 때로 해주었다.
2. 출력
재귀함수 내에서 바로 출력을 하면 정말 깔끔하겠지만,
그럼 반대로 출력된다
ex) 1010 이 출력되어야 하는데 0101으로 출력됨
그래서 나는 스택을 사용했다.
재귀함수의 구조를 바꾸어서 순서대로 출력되게끔 하고 싶었는데,
재귀호출의 종료 조건을 만나고 나서야 차례대로 리턴하는 재귀함수의 특성 상
그럴 수 없을 것 같았다(?)
3. 재귀함수의 매개변수
함수를 호출할 때마다 stack을 넘기고 싶지 않아서 참조자를 사용했다.
4. 스택 출력
반복문을 사용할 수 없기 때문에 스택의 내용을 출력하는 것 역시
재귀함수를 이용했다.
이렇게는 처음 해보는데 생각보다 깔끔하게 나와줘서 만족스럽다!