코딩테스트

비트 연산자 _ shift operator (<<)

GABOJOK 2023. 9. 8. 11:00

 

 

처음에는 단순히 for문과 if문을 통해 풀었지만, 좀더 효율적인 방법이 있어 적는다.

일단 비교를 하자면, 

 

1. for문과 if문으로 결과값 도출 __ 약 0.04ms 소요

2. while문과 연산자로 결과값 도출 __ 약 0.03ms 소요

3. 비트연산자 shift 연산자로 결과값 도출 __ 약 0.02ms 소요

 

 

 

2번 방법부터 봐보자.

function solution(n, t) {
    while (t-- > 0) n*=2;
    return n;
}

 

  • while 문은 괄호 안의 조건이 성립하는 동안에는 계속해서 반복한다. 
  • a++ 연산자로 a+1 을 할 수 있듯,   a-- 연산자로 a-1 을 할 수  있다. 
  • a+= 연산자로 더하기 할당을 할 수 있듯,  a*= 연산자로 곱하기 할당을 할 수 있다. 

 

3번 방법

function solution(n, t) {
    return n<<t
}

사실 이 방법 보고 경악했다...

나의 길게 늘어진 코드와 너무 상반되서... 이 연산자에 대해 모르고 있었는데

바로 찾아보기 시작.. ㅎㅎㅎ

 

자세한건 js 카테고리에 적어둘 예정이다. 일단 간단하게 말하면,

2진수와 관련되어 있고, 10진수 (인간이 사용하는 수)의 정수 10을 2진수로 변환하면 아래와 같다

 

0 0 0 0 1 0 1 0

 

이 숫자들을 화살표 방향으로 이동하는데, 해당 연산자 우측에 있는 숫자만큼 이동하라는 말이다. 

만약 10<<2 이렇게 쓰여있다면, 

0 0 0 0 1 0 1 0   이 수들을 왼쪽으로 두칸씩 이동하라는 말

0 0 1 0 1 0 0 0    결과값은 이렇다. 

 

이걸 다시 10진수로 변환하면, 정수 40이 나온다. 

 

여기에는 규칙이 있다. 

n<<t  이 말은 n* (2의 t승) 이라는 말이다. 

 

n*( 2 ^ t)   

 

 

이 문제의 의도와 아주 딱 맞는 풀이가 아닌가 싶었다..