6. 스파르타 코딩 클럽 - 3월 18일 코딩테스트 연습 (코드카타)
❓ 오늘의 문제
1. 세균 증식
- 어떤 세균은 1시간에 두 배만큼 증식한다고 합니다. 처음 세균의 마릿수 n과 경과한 시간 t가 매개변수로 주어질 때 t시간 후 세균의 수를 return 하도록 solution 함수를 완성해 주세요.
나의 답안 코드
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^t를 n * (1 << t)로 구현할 수 있었다.
비트 연산을 사용하면 처음 for문으로 코드를 구현했을 때보다 짧고 간편하게 구현할 수 있는 장점이 있다.