스파르타 코딩 클럽 - iOS 스타터 6기/알고리즘 코드카타

6. 스파르타 코딩 클럽 - 3월 18일 코딩테스트 연습 (코드카타)

seongpil Heo 2025. 3. 18. 10:09

 ❓ 오늘의 문제

1. 세균 증식

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

세균 증식 - for문 코드

나의 답안 코드

import Foundation

func solution(_ n: Int, _ t: Int) -> Int {
    var result = n
    for _ in 1...t {
        result *= 2
    }
    return result
}

 

 

세균 증식 - 시프트 연산 코드

나의 답안 코드

import Foundation

func solution(_ n: Int, _ t: Int) -> Int {
    return n * (1 << t) 
}

 ✓ TIL

오늘은 세균 증식이라는 문제를 풀어보았다.

문제를 읽어보면 경과한 시간에 따른 세균의 수를 return 하는 함수를 만드는 것인데 해석하면 제곱을 구하는 함수이다.

처음 세균의 마리수 n
경과한 시간 t

// 계산식
n * 2^t

 

단순하게 for문을 돌려서 함수를 완성할 수 있지만 Swift에 다른 제곱을 계산하는 방법이 있을 거 같아서 구글링으로 찾아보았다.

찾아보니 pow()라는 메서드를 이용하는 방법이 있고, 시프트 연산자를 이용해서 비트 연산을 하는 방법이 있었다.

 

pow 메서드는 Double형으로 값을 입력하고 Double를 반환하여 정수로 변환해야 하는데 

Int로 변환할 때 정확한 정수가 아닐 경우 오류가 발생할 수 있어서 내 케이스에는 맞지 않았고,

비트 연산을 이용하기로 했다.

 

위에 2개의 사진 중 처음 사진은 for문을 이용해서 단순하게 경과한 시간만큼 n에 2를 곱해서 결과를 구하는 함수이고,

두 번째 사진은 시프트 연산자를 이용해 비트 연산을 하는 함수이다.

import Foundation

func solution(_ n: Int, _ t: Int) -> Int {
    return n * (1 << t) 
}

 

코드를 설명하면 비트 연산자 << (Left Shift)를 사용하여 1을 왼쪽으로 t비트 이동시켜 2^t을 만든다.

비트 왼쪽 및 오른쪽 시프트는 정수를 2배로 곱하거나 나누는 효과가 있다.

예를 들어 t가 3이면 1 << 3 → 2^3 = 8

비트로 표현하면 0001 → 1000  ▶ 8

 

따라서 맨 처음 내가 구현해야 할 계산식인 n * 2^tn * (1 << t)로 구현할 수 있었다.

비트 연산을 사용하면 처음 for문으로 코드를 구현했을 때보다 짧고 간편하게 구현할 수 있는 장점이 있다.


 😼 GitHub

잔디 심기 완료