๊ธฐ๋ก๋ฐฉ

Lv.2 : ๋‹ค์Œ ํฐ ์ˆซ์ž ๋ณธ๋ฌธ

CodingTest/Java

Lv.2 : ๋‹ค์Œ ํฐ ์ˆซ์ž

Soom_1n 2023. 9. 7. 23:17

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

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

๐Ÿ”ธ ๋ฌธ์ œ ํ’€์ด ๐Ÿ”ธ

  • n์„ 2์ง„์ˆ˜ ๋ณ€ํ™˜ ํ›„ 1์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ ์ €์žฅํ•œ๋‹ค.
  • n์„ 1์”ฉ ์ฆ๊ฐ€ํ•ด๊ฐ€๋ฉฐ ๋‹ค์Œ ํฐ ์ˆซ์ž์˜ ์ •์˜๋ฅผ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • 2์ง„์ˆ˜ ๋ฌธ์ž์—ด์˜ 1์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ถ€๋ถ„์—์„œ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

class Solution {
    public int solution(int n) {
        int one_cnt = count_bit(Integer.toBinaryString(n));
        
        while(true) {
            int next_num_one_cnt = count_bit(Integer.toBinaryString(++n));
            if(one_cnt == next_num_one_cnt) break;
        }
        
        return n;
    }
    
    private int count_bit(String binaryString) {
        int count = 0;
        int binary = Integer.parseInt(binaryString, 2);

        while (binary != 0) {
            count += (binary & 1); // ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ•œ ๋น„ํŠธ์”ฉ ํ™•์ธ
            binary >>>= 1; // ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋น„ํŠธ ์ด๋™
        }
    
        return count;
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ๋‹ค์Œ ํฐ ์ˆ˜๊ฐ€ ๋งŒ์กฑ ํ•  ๋•Œ๊นŒ์ง€ n์„ +1ํ•˜๋ฉฐ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • 2์ง„์ˆ˜ ๋ฌธ์ž์—ด์—์„œ ๋น„ํŠธ์—ฐ์‚ฐ์„ ํ†ตํ•ด 1์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•œ๋‹ค.

๐Ÿ”ธ ์˜ค๋‹ต ์ฝ”๋“œ 1 ๐Ÿ”ธ

class Solution {
    public int solution(int n) {
                   
        int one_cnt = Integer.toBinaryString(n).replaceAll("0","").length();
        
        while(true) {
            int next_num_one_cnt = Integer.toBinaryString(++n).replaceAll("0","").length();
            if(one_cnt == next_num_one_cnt) break;
        }
        
        return n;
    }
}

 

  • 2์ง„์ˆ˜ ๋ฌธ์ž์—ด์—์„œ 0์„ ์ œ๊ฑฐํ•˜๊ตฌ ๊ธธ์ด๋ฅผ ์„ธ์„œ 1์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.
  • replaceAll๊ณผ length ๋ชจ๋‘ ๋ฌธ์ž์—ด์„ ์ „์ฒด ์ˆœํšŒํ•ด์„œ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋„ˆ๋ฌด ์ปค์ ธ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค.

๐Ÿ”ธ ์˜ค๋‹ต ์ฝ”๋“œ 2 ๐Ÿ”ธ

class Solution {
    public int solution(int n) {
        
        String binary = Integer.toBinaryString(n);
        
        char[] bc = binary.toCharArray();
        int last_idx = binary.lastIndexOf('1');

        String plus_ones = ""; // ์ถ”๊ฐ€ํ•ด์•ผ ๋  1๋“ค
        
        while(true) {
            if(last_idx == 0) {
                bc[0] = '0';
                binary = "1" + String.valueOf(bc);
                break;
            } else if (bc[last_idx-1] == '1') {
                bc[last_idx] = '0';
                last_idx--;
                plus_ones += "1";
            } else {
                bc[last_idx] = '0';
                bc[last_idx-1] = '1';
                binary = String.valueOf(bc);
                break;
            }
        }
        
        int answer = Integer.parseInt(binary, 2);
        
        if(plus_ones.length() > 0) {
            answer += Integer.parseInt(plus_ones, 2);
        }
        
        return answer;        
    }
}
  • ์˜ค๋‹ต 1๋ฒˆ์—์„œ ๋‹ค๋ฅธ์ชฝ์„ ์‹œ๋„ํ•ด๋ณด๊ณ ์ž 1์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š”๊ฒŒ ์•„๋‹Œ, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ 1์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • 1์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์•„์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ 1์˜ ์ธ๋ฑ์Šค์—์„œ 1์„ ๋”ํ•ด์„œ 2์ง„์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
    • ์‚ฌ๋ผ์ง„ 1๋งŒํผ ๋”ํ•ด์ฃผ๋ฉด ๋‹ค์Œ ํฐ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ์ ˆ๋ฐ˜์ •๋„๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œจ๊ฒŒ ๋œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, replaceAll()๊ณผ length()์˜ ์œ„ํ—˜์„ฑ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ๋ดค๋Š”๋ฐ ๋ฐฐ์šธ ์ ์ด ๋งŽ์•˜๋‹ค.
    • ๋‹จ์ˆœํ•˜๊ฒŒ 2์ง„๋ฒ• ํŒจํ„ด์œผ๋กœ ๋น„ํŠธ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„ ํ’€์ด๋กœ ๊ฐ€์žฅ ์งง๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ณด์˜€๋Š”๋ฐ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๊ณ„์‚ฐ์„ ๋”ฐ๋ผ๊ฐ€๋ณด๋ฉด ๋น„ํŠธ ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•œ๊ฒŒ ๋ณด์ด๋Š”๋ฐ ์›๋ฆฌ๊นŒ์ง„ ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค.
    • ๋‚˜๋Š” 1์„ ๋น„ํŠธ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ธ๋Š”๋ฐ, Integer.bitCount()๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ํ™œ์šฉํ•ด์•ผ๊ฒ ๋‹ค.

728x90