프로그래머스 : 이진 변환 반복하기 (C++)
문제
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
vector<int> solution(string s) {
vector<int> answer;
int cnt = 0;
int zero_cnt = 0;
while(s != "1"){
int one_cnt = 0;
for(int i = 0; i < s.size(); i++){
if (s[i] == '0') zero_cnt++;
else one_cnt++;
}
s = "";
while(one_cnt != 0){
if(one_cnt % 2 == 1) s += "1";
else s += "0";
one_cnt /= 2;
}
cnt++;
}
answer.push_back(cnt);
answer.push_back(zero_cnt);
return answer;
}
접근 및 풀이
레벨 2가 넘어가니 슬슬 머리를 써야 하는 문제가 나오기 시작했다. 처음에는 사실 문제를 잘못 읽기도 했고 너무 단순히 생각해서 효율적인 방법을 생각 못하고 문제 설명대로 0을 제거한 문자열을 만들고, 문자열 사이즈를 재고, 그것을 다시 2진수로 바꾸고 / 2진수 → 10진수 / 10진수 → 2진수 함수도 만들고 이랬는데 그럴 필요까지 없는 문제였다.
핵심만 설명해보겠다.
굳이 x에서 0을 제거한 문자열은 중간에 만들어줄 필요가 없다. 0을 제거하고 나서의 문자열의 길이는 1의 개수와 같기 때문에 1의 개수만 세어 변수에 넣어 준 뒤 해당 숫자를 2진수로 변환하기만 하면 된다.
그리고 나서 10진수 → 2진수로 바꿔주는 로직은 그대로 행하지만 다음 반복문에서 사용해야 하기 때문에 문자열로 만들어준다. 여기에서 또 핵심은 굳이 reverse()
를 해주지 않아도 된다는 것이다. 어차피 다음 반복문에서 0을 모두 제거해줄 것이기 때문에 1과 0의 순서 자체는 상관없게 되기 때문이다.
이 두 가지만 신경 써준다면 불필요한 과정 없이 조금 더 효율적으로 문제를 해결할 수 있다.
댓글남기기