[C++] 백준 3460 : 이진수

Kim Nahyeong·2022년 1월 6일
0

백준

목록 보기
29/157

#include <iostream>

int main(int argc, char **argv){
    int T, n, idx = 0;
    scanf("%d",&T);

    for(int i=0; i<T; i++){
        int arr[100001] = {0}; // 배열 안써도 풀 수 있다.
        scanf("%d",&n);
        while(n != 1){ // n > 0 을 쓰는게 더 효율적
            if(n % 2 == 1){
                arr[idx]++; // 그냥 idx 출력해버리는게 더 효율적
            }
            n /= 2;
            idx++;
        }
        arr[idx] = 1; // 이거 없어도 됨

        for(int j=0; j<=idx; j++){ // 일을 두 번 하네...
            if(arr[j] > 0){
                printf("%d ", j);
            }
        }
        idx = 0;
    }

    return 0;
}

오늘의 키포인트

  • 굳이 배열을 쓰지 않아도 됐다. 배열 쓰지 말고 나머지가 1일때 그 자릿수를 출력해주는 것이 더 효율적이었을 것이다. 결국 일을 두 번 하는 꼴이 되었다.
  • while문을 1이 아닐때까지 하는게 아니라, 어쨌든 1 % 2 = 1 이기 때문에 반복문을 n > 0 일 때까지 돌리는 것이 좋았을 것이다.

다른 분은 코드를 이렇게 짜셨더라

#include <iostream>
using namespace std;
 
int main() {
    int T, n;
    cin >> T;
 
    while (T--) {
        cin >> n;
        int digit = 0;
        while (n > 0) {
            if (n % 2 == 1) {
                cout << digit << " ";
            }
            n /= 2;
            digit++;
        }
    }
}

딱 봐도 훨씬 간결하다.

0개의 댓글