나 개발자 진짜 되냐?

코딩테스트 입문 - 이진수 만들기 ( while, reverse ) 본문

프로그래머스를 풀어보아요!/C++

코딩테스트 입문 - 이진수 만들기 ( while, reverse )

Snow Rabbit 2026. 5. 21. 22:26

 

 

어려운 듯 안 어려운 듯..

풀이방법을 몰라서

자꾸 인지 씨를 찾는다.

 

괴롭다


 

흠.....

이런 이진수엔 비트마스크? 막 >> << 이거 좋았던 거 같은데..

 

..

인지 씨는 NO라고 했다.

 

그리고 뭔 올림수? 가 필요하다고 말했다.

맨 뒤부터

더해주고

올림수가 있으면 다음에 더해주고 그러라는 거 같다.

 

쉽게 설명해 달라고 부탁했다.

 

1. 일의 자리부터 본다.

2. bin1과 bin2를 본다.

3. 둘 다 1일 경우 1+1은 2기 때문에

0이면, /2를 해준 몫이 = 1 다음 자리 숫자로 올라가고

/2 해준 나머지가 처음자리 숫자가 된다. 아마 0이겠죠?

 

 

1.

문자열 길이 -1

bin1.size() -1

 

2.

while문으로 만들어야 한다.

한 칸씩 앞으로 이동하면서 덧셈을 하도록

그래서 i 가 0이 아니고 j도 0이 아니고 carry 더 이상 올릴 수도 0일 때까지

셋다 될 때까지 돌릴 테니

 

or문으로

while(i >= 0 || j >= 0 || carry > 0)

 

작성한다.

 

3.

원리는 이렇다.

올림수를 sum에 따로 저장해 두고

i는 여기서 자릿수이다.

i >= 0

나눌 수가 있다면,

sum에 그 숫자를 더해주고

i-- 해줘서 자릿수를 앞으로 당긴다.

 

sum += (bin1[i] - '0');
i--;

 

보통 1 아님 0이 들었으니

sum에는 0이나 1이 더해졌을 것이다.

 

j도 마찬가지이다.

 

그렇게 한 사이클 다 돌리게 되면

answer에다가 string으로 바꾸고 넣어줘야 하는데.

아래자릿수를 먼저 넣어줘야 하니까

% 2 하고 남은수를 넣게 된다.

 

answer += to_string(sum%2);

 

그리고 이제 올라갈 수 carry 에는

올림수를 넣게 된다.

 

carry = sum/2;

 

위에 식에서 1,1이라고 치게 되면

1을 sum에 더하고

1도 sum을 더했으니 답은 2.. 지만 여기선 2가 10 이니까

carry에는 2/2 한몫을

원래 자리에는 2/2한 나머지를 넣는 것이다.

 

그럼 이제 carry이 1이 되고 나서

다시 sum의 값이 시작되겠다.

또 11 일경우

sum값은 3이 되면서

나머지 몫 둘 다 11 이 나오게 된다.

 

 

제일 중요한 것은

우리는 맨 뒤부터 했는데 answer에는 또 맨 앞부터 push 되기 때문에

마지막에 reverse를 해줘야 한다.

 

 

 


 

 

이렇게 다 이해하고 문제를 뒤집어서 생각하면 참 쉬운데 말이다.

다시 풀려고 하면 또 못 풀고..

숫자 더하는 게 이렇게 어려운 건가....