반응형
요즘 코테 공부에 빠져 풀기만 했는데
다른 사람에게 설명해주는 글을 쓰는게 내가 더 공부할 수 있고
깊이있게 이해하기에 좋겠다는 생각이 들었다.
❓ 문제: 세균 증식
// 문제 설명
어떤 세균은 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
글만 봐서는 정확히 이해되지 않아 이미지를 찾아봤다.
그림처럼 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);
}
정규식도 그렇고 수학적으로 생각하는 훈련을 계속 해야겠다.
반응형
'코딩 생활 > 코딩테스트' 카테고리의 다른 글
[프로그래머스 | JS] 레벨 0. 원소들의 곱과 합 (0) | 2023.04.24 |
---|---|
[프로그래머스 | JS] 레벨 1. 예산 (feat. 내부적인 오류....) (0) | 2023.04.14 |
[프로그래머스 | JS] 레벨 0. 특이한 정렬 (feat. sort()) (0) | 2023.04.14 |
[프로그래머스 | JS] 레벨 0. 중복된 문자 제거 (feat. Set 객체) (0) | 2023.04.12 |
[프로그래머스 | JS] 레벨 0. 점의 위치 구하기 (0) | 2023.03.10 |
댓글