본문 바로가기
코딩 생활/코딩테스트

[프로그래머스 | JS] 레벨 0. 세균증식 (feat. 비트 연산자)

by everyhahaha 2023. 3. 10.
반응형

요즘 코테 공부에 빠져 풀기만 했는데

다른 사람에게 설명해주는 글을 쓰는게 내가 더 공부할 수 있고

깊이있게 이해하기에 좋겠다는 생각이 들었다.

 


❓ 문제: 세균 증식

// 문제 설명
어떤 세균은 1시간에 두배만큼 증식한다고 합니다. 처음 세균의 마리수 n과 경과한 시간 t가 매개변수로 주어질 때 
t시간 후 세균의 수를 return하도록 solution 함수를 완성해주세요.

// 제한사항
1. 1 ≤ n ≤ 10
2. 1 ≤ t ≤ 15

📝 문제 풀이

문제를 읽고 처음에 생각한 방법은 for문이다.

시간복잡도가 O(n)이지만 제한사항의 범위가 비교적 작아서 그대로 풀었다.

// 나의 풀이
function solution(n, t) {
	// 시간(t)까지 for문 반복해서 시간이 지난 후의 세균(n) 수 바로 변수 n에 저장
    for(let i = 1; i <= t; i++) n *= 2
    return n;
}

더 간결하고 깔쌈한 방법이 없을까 고민해봤지만 딱히 생각나지 않아 다른 분들의 풀이를 참고하기로 했다.

그런데.....

// 다른 분 풀이
function solution(n, t) {
  return n << t;
}

와 이리도 깔끔할수가. 

처음보는 연산자였다ㅎㅎ  << 시프트 연산이라는 비트 연산자라고 한다.

사실 비트 연산자에 대해 확실히 몰라 이번 기회에 알아보고자 한다.


🔍 더 파고들기

우선 왼쪽 시프트란?

왼쪽 시프트 (<<) 연산자는 첫 번째 피연산자를 명시된 비트 수(32의 나머지)만큼 왼쪽으로 이동합니다.
왼쪽으로 이동된 초과 비트는 폐기됩니다. 오른쪽은 움직인 비트 수 만큼 0비트로 채워집니다.
👉 참조: mdn 
 

왼쪽 시프트 (<<) - JavaScript | MDN

왼쪽 시프트 (<<) 연산자는 첫 번째 피연산자를 명시된 비트 수(32의 나머지)만큼 왼쪽으로 이동합니다. 왼쪽으로 이동된 초과 비트는 폐기됩니다. 오른쪽은 움직인 비트 수 만큼 0비트로 채워집

developer.mozilla.org

 

출처:&nbsp;https://www.log2base2.com/C/bitwise/bitwise-left-shift-operator-in-c.html

글만 봐서는 정확히 이해되지 않아 이미지를 찾아봤다.

 

그림처럼  14 << 1  로 예를 들면,

    1. 10진수인 첫 번째 피연산자(14)를 2진수로 변환해서 명시한 비트 수(1)만큼 왼쪽으로 이동시키고

    2. 옮긴 뒤 초과된 비트는 버려진다.

즉, 연산자 오른쪽의 수에  **2  된 값이 피연산자에 곱해지는 것!

 

mdn 사이트를 다시 읽어보니 너무나도 친절한 설명이 있었다.

9 << 3; // 72
// 9 * (2 ** 3) = 9 * (8) = 72

 

 

즉, 거듭제곱 연산자를 이용한 풀이도 가능해진다.

function solution(n, t) {
  return n * (t ** 2);
}

예상은 했지만 역시 for문보다 빠르다

 

정규식도 그렇고 수학적으로 생각하는 훈련을 계속 해야겠다.

 

반응형

댓글