250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • 프로그래머스
  • ADsP
  • 카카오
  • DP
  • SpringMVC
  • swift
  • 백준
  • 머신러닝
  • java
  • 개발
  • data
  • 브루트포스
  • certificate
  • 자바
  • Python
  • 선형대수
  • 문제풀이
  • BOJ
  • BFS
  • JAVA8
  • 파이썬
  • Front-end
  • 알고리즘
  • AI
  • ios
  • 개발자
  • 구현
  • JPA
  • uArm
  • 코딩테스트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim

Hello World!

[PGM_77885] 2개 이하로 다른 비트 (Java)
CodingTest/Programmers

[PGM_77885] 2개 이하로 다른 비트 (Java)

2022. 3. 16. 22:50
728x90
728x90

문제링크

https://programmers.co.kr/learn/courses/30/lessons/77885?language=java 

 

코딩테스트 연습 - 2개 이하로 다른 비트

 

programmers.co.kr

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
 비트연산자

1. 문제 이해

$f(x)$ = $x$ 보다는 크지만 비트 2개만 변경된 값 중 최소값으로 정의되는 함수 $f$가 있을 때, $f(x)$의 값을 구해주는 문제이다. 

 

2. 접근방법

bit연산자인 &연산자를 사용하여 문제를 해결할 수 있다.

 

&연산자는 and연산으로 a & b에서 불 대수 a,b가 모두 1인 경우만 1이다.

비트 두개만 변경하여 최소가 되기 위해서는 가장 작은 위치의 0값을 찾아 1로 바꾸어주고 가장 작은 위치 바로 아래의 1을 0으로 바꾸어주는 경우가 최대이다.

 

즉 비트연산 10111011이 있는 경우 파란색으로 표시된 0이 최소자리의 0이므로 그 부분을 1로 변경하여주고, 그리고 바로 뒤 빨간색 1을 0으로 변경해주면 된다. 이 연산은 0100을 더해주고 0010을 빼주는 것과 같다.

 

예외적인 상황으로는 1111110와 같이 처음이 0인 경우이다. 이 경우는 빼줄 수 있는 경우가 없으므로 빼는 연산은 수행하지 않는다. 

구현코드

package pgm_77885;

public class Solution {
    public long[] solution(long[] numbers) {
        long[] answer = new long[numbers.length];
        int idx = 0;
        for(long number : numbers){
            long value = solve(number);
            answer[idx++] = value;
        }
        return answer;
    }

    public long solve(long number){
        long depth = 0;
        long target = number;
        while (true){
            if((target&1) == 0){
                break;
            }
            target /= 2;
            depth++;
        }

        double addValue = Math.pow(2, depth);
        double minusValue = depth == 0 ? 0 : Math.pow(2, depth-1);
        return number + (long) addValue - (long)minusValue;
    }
}
잘못된 지식이나 궁금한 내용이 있을 경우 편하게 댓글 남겨주시면 감사하겠습니다 :)
728x90
728x90
저작자표시 비영리 (새창열림)

'CodingTest > Programmers' 카테고리의 다른 글

[PGM] 주식 가격 (Java)  (0) 2022.03.27
[PGM_12981] 영어 끝말잇기 (Java)  (0) 2022.03.17
[PGM_42883] 큰 수 만들기 (Java)  (0) 2022.03.14
[PGM_42583] 다리를 지나가는 트럭  (0) 2022.03.13
[PGM_17679] 프렌즈 4블록  (0) 2022.03.11
    'CodingTest/Programmers' 카테고리의 다른 글
    • [PGM] 주식 가격 (Java)
    • [PGM_12981] 영어 끝말잇기 (Java)
    • [PGM_42883] 큰 수 만들기 (Java)
    • [PGM_42583] 다리를 지나가는 트럭
    JinSeopKim
    JinSeopKim
    기록📚

    티스토리툴바