[c++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค :: ๋‹ค์Œ ํฐ ์ˆซ์ž (๋ฌธ์ œ ํ’€์ด, ์ฝ”๋“œ)

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ

๋‹ค์Œ ํฐ ์ˆซ์ž

https://programmers.co.kr/learn/courses/30/lessons/12911

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋‹ค์Œ ํฐ ์ˆซ์ž

์ž์—ฐ์ˆ˜ n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, n์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ ํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด 1. n์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž๋Š” n๋ณด๋‹ค ํฐ ์ž์—ฐ์ˆ˜ ์ž…๋‹ˆ๋‹ค. ์กฐ๊ฑด 2. n์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž์™€ n์€ 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ–ˆ์„ ๋•Œ 1์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๊ฐ™์Šต๋‹ˆ

programmers.co.kr

 

1. ๋ฌธ์ œ

๋ฌธ์ œ๋ฅผ ๊ณ„์† ์—†์• ๊ธธ๋ž˜ ๋ณต์‚ฌํ•ด๋‘”๋‹ค.

 

๋ฌธ์ œ ์„ค๋ช…

์ž์—ฐ์ˆ˜ n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, n์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ ํ•ฉ๋‹ˆ๋‹ค.

  • ์กฐ๊ฑด 1. n์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž๋Š” n๋ณด๋‹ค ํฐ ์ž์—ฐ์ˆ˜ ์ž…๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด 2. n์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž์™€ n์€ 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ–ˆ์„ ๋•Œ 1์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด 3. n์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž๋Š” ์กฐ๊ฑด 1, 2๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜ ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ 78(1001110)์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž๋Š” 83(1010011)์ž…๋‹ˆ๋‹ค.

์ž์—ฐ์ˆ˜ n์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, n์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž๋ฅผ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 
1.0.1. ์ œํ•œ ์‚ฌํ•ญ
  • n์€ 1,000,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜ ์ž…๋‹ˆ๋‹ค.

 
1.0.2. ์ž…์ถœ๋ ฅ ์˜ˆ
n result
78 83
15 23
 
1.0.3. ์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ#1
๋ฌธ์ œ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ž…์ถœ๋ ฅ ์˜ˆ#2
15(1111)์˜ ๋‹ค์Œ ํฐ ์ˆซ์ž๋Š” 23(10111)์ž…๋‹ˆ๋‹ค.

 

2. ์ฝ”๋“œ

#include <string>
#include <vector>

using namespace std;

int numOfOne(int x){
    int i = 1;
    int num=0;
    while(i<=x){
        if((x & i)!=0){ // ํ•ด๋‹น ์ž๋ฆฟ์ˆ˜๊ฐ€ 1์ด๋ฉด
            num++;
        }
        i*=2;
    }
    return num;
}

int solution(int n) {
    int answer = 0;
    int cmp = numOfOne(n);
    answer = cmp;

    for(int i=n+1; i<=1000000; i++){
        if(numOfOne(i)==cmp){
            answer = i;
            break;
        }
    }

    return answer;
}

 

3. ํ’€์ด

 ์šฐ์„  ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผํ•˜๊ณ  ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ’€์–ด์ง€๋Š”์ง€๋ฅผ ๊ณ ๋ฏผํ–ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” n๋ฐ–์— ์—†๊ณ  ๋ฒ”์œ„๊ฐ€ 10^6์ด๋‹ˆ, O(n)์ด๋‚˜ O(nlgn)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ์™„์ „ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋‹ค.

 ์™„์ „ํƒ์ƒ‰์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ฃผ์–ด์ง„ n๋ณด๋‹ค 1ํฐ n+1๋ถ€ํ„ฐ n์˜ ์ตœ๋Œ€ ๊ฐ’์ธ 1,000,000๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณด๋ฉด์„œ ํ•ด๋‹น ์ˆ˜๊ฐ€ 2์ง„๋ฒ•์œผ๋กœ ๋‚˜ํƒ€๋ƒˆ์„ ๋•Œ, n๊ณผ ๊ฐ™์€ 1์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ •๋‹ต์„ ๋‚ด๋Š” ์‹์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 ํ•ด๋‹น ์ˆ˜๊ฐ€ n๊ณผ ๊ฐ™์€ 1์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋Š” ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ? ๋‚˜๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ 1์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ชจ๋‘ ์„ธ์–ด๋ณด๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋น„ํŠธ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ & ์—ฐ์‚ฐ์œผ๋กœ 1์˜ ์ˆ˜๋ฅผ ์„ธ์—ˆ๋‹ค.

 

๋น„ํŠธ ์—ฐ์‚ฐ ์„ค๋ช…

while(i<=x){
    if((x & i)!=0){ // ํ•ด๋‹น ์ž๋ฆฟ์ˆ˜๊ฐ€ 1์ด๋ฉด
        num++;
    }
    i*=2;
}

 

 ์ด๋ ‡๊ฒŒ i๊ฐ€ x๋ณด๋‹ค ํฌ์ง€ ์•Š์„๋•Œ๊นŒ์ง€, i๋ฅผ 2์”ฉ ๊ณฑํ•ด์ฃผ๋ฉฐ &์—ฐ์‚ฐํ–ˆ๋‹ค. ์ด ๊ฒฐ๊ณผ๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ํ•ด๋‹น ์ž๋ฆฟ์ˆ˜๋Š” 1์ด๋ผ๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์— num์„ 1 ์ฆ๊ฐ€์‹œ์ผœ์คฌ๋‹ค. ์ด ์—ฐ์‚ฐ์€ ๋น„ํŠธ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์œผ๋กœ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. ๊ฒฐ๊ณผ

 ์ƒ๊ฐ๋ณด๋‹ค ์—„์ฒญ ๋น ๋ฅด๊ฒŒ ์‹œํ–‰๋œ๋‹ค;

 

5. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

 %2 ์—ฐ์‚ฐ์œผ๋กœ 2๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ฐพ๊ณ , /2 ์—ฐ์‚ฐ์œผ๋กœ ์‰ฌํ”„ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ’€์ด๋„ ์žˆ์—ˆ๋‹ค. ๋‚ด ํ’€์ด๋ฅผ ์—ญ์ˆœ์œผ๋กœ ๋ฐ”๊พผ ํ’€์ด์ด๋‹ค.

๋ฐ˜์‘ํ˜•