[CodeUp] no.1920 2진수 변환

박민주·2021년 9월 20일
2

CodeUp

목록 보기
1/1
post-thumbnail

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. 스택 출력
반복문을 사용할 수 없기 때문에 스택의 내용을 출력하는 것 역시
재귀함수를 이용했다.
이렇게는 처음 해보는데 생각보다 깔끔하게 나와줘서 만족스럽다!

profile
Game Programmer

0개의 댓글

관련 채용 정보