코딩테스트 회고록/코테_Java

[JAVA] 프로그래머스 - 세균 증식

iamjisu 2023. 2. 4. 12:05

프로그래머스 코딩테스트 연습 입문단계 '세균 증식' 문제입니다.

https://school.programmers.co.kr/learn/courses/30/lessons/120910

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명

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


⚠️ 제한사항 및 입출력 예

  • 1 ≤ n ≤ 10
  • 1 ≤ t ≤ 15

 

n (입력) t (입력) result (출력)
2 10 2048
7 15 229,376

✏️ 직접 구현한 코드

class Solution {
    public int solution(int n, int t) {
        int i = 1;
        int res = n;
        while(i <= t) {
            res = res * 2;
            i++;
        }
        return res;
    }
}

🗣️ 코드 설명

  1. res변수에 매개변수 n의 값을 넣었습니다.
  2. i가 t보다 작을 때까지 반복하는 while문을 만들고, 그 안에서 res가 반복할 때마다 2씩 곱해지도록 했습니다.

🔥다른 사람의 코드

class Solution {
    public int solution(int n, int t) {
        int answer = 0;

        answer = n << t;

        return answer;
    }
}

이 사람은 비트 이동 연산자(시프트 연산자)를 이용해 반복문도 사용하지 않고 문제를 풀었네요..

아래에서 비트이동 연산자에 대해 더 자세히 알아보겠습니다!!


⭐ 새롭게 알게 된 점

비트 이동 연산자(시프트 연산자)

간단하게 말하면, 피연산자의 비트열을 이동시키는 연산자입니다.

 

java에는 총 세 가지의 비트 이동 연산자가 있습니다.

  • << : 피연산자의 비트열을 왼쪽으로 이동시키고, 이동으로 생긴 빈 공간은  0으로 채운다.
  • >> : 피연산자의 비트열을 오른쪽으로 이동시키고, 이동으로 생긴 빈 공간은 음수면 1, 양수면 0으로 채운다.
  • >>> : 피연산자의 비트열을 오른쪽으로 이동시키고, 이동으로 생긴 빈 공간은 0으로 채운다. (음수와 양수 상관없이.)

사용 예를 들어보자면,

int num = 2 << 1; ( 2의 비트열 오른쪽으로 1칸 이동 )

00000010의 비트열을 오른쪽으로 1칸 이동시키면, 00000100 == 4

비트열을 오른쪽으로 1칸 이동시키는 것2를 1번 곱하는 것은 같습니다.

 

다시 말해, 2진수의 특성을 이용해 곱셈과 나눗셈을 할 수 있는 것 입니다.

왼쪽으로 한 칸씩 비트열을 움직이면 2의 배수곱, 오른쪽으로 한 칸씩 비트열을 움직이면 2의 배수 나눗셈이 되는 것이죠.

 

answer = n << t ;

n의 비트열을 오른쪽으로 t칸 이동시킨 값을 answer변수에 넣는 것입니다. 즉, 2의 배수곱을 t번 반복시킨 값을 answer에 넣는 것이라는 거죠!!

( n * 2 = 2n,  n * 4 = 4n,  n * 8 = 8n ... ) ◀ t번 반복


💦 어려웠던 점

이번에도 또 문제를 제대로 읽지 않았습니다.

계속 2씩 곱해지는 것인데, 자기자신을 곱하도록 코드를 구현해 시간이 좀 걸렸던 것 같습니다.

정말 이제부터는 문제를 정확히 이해한 후 코드를 구현해나가기 시작할 것 입니다.   :(