코딩 테스트 Coding Test 와 코드 리뷰 Code Review
코딩 테스트 문제풀이의 목표
- 코딩 테스트 문제풀이를 하며 알고리즘에 대한 이해도를 높힌다
- 팀원들과 코드 리뷰를 하며 해당 코드를 짠 구체적인 이유를 제시한다
문제 1 : https://school.programmers.co.kr/learn/courses/30/lessons/120837
# 개미군단
# 문제설명
# 개미 군단이 사냥을 나가려고 합니다.
# 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다.
# 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다.
# 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만,
# 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다.
# 사냥감의 체력 hp가 매개변수로 주어질 때,
# 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를
# return하도록 solution 함수를 완성해주세요.
# 제한사항
# hp는 자연수입니다.
# 0 ≤ hp ≤ 1000
def solution(hp):
answer = hp//5+hp%5//3+hp%5%3
return answer
먼저 반드시 장군개미가 들어가는 것이 이득인지를 생각해보았다.
1 부터 10까지의 경우의수를 생각해보니
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | 1 | 2 | 1 | 2 | 3 | 2 | 3 | 2 |
이렇게 나온다. 장군개미가 무조건 들어가는 것이 이득이다.
hp를 장군개미(5)로 나눈 몫(hp//5)을 먼저 계산하고
나머지(hp%5) 중에 3으로 나눈 몫(hp%5//3)과 나머지(hp%5%3)를 계산하면 끝이다.
하지만 무조건 한가지 방법으로만 풀라는 법은 없지.
좀 더 생각할 시간을 가져보고 생각해보니 다른풀이가 생각났다.
def solution(hp):
a = hp//5
b = 2 if hp%5%2==0 else 1
answer = a+b
return answer
1~4까지의 최소값을 보면 홀수는 1, 짝수는 2가 나온다
즉 어차피 5로 나눈 나머지는 1~4까지니깐 홀수냐 짝수냐에 따라 b의 값을 정해줘봤다.
당연히 답으로 잘 나온다
if문이 추가되서 리소스는 더 많이 먹겠지만 코드짜는 방법에 다양화도 필요하다
문제 2 : https://school.programmers.co.kr/learn/courses/30/lessons/120819
# 아메리카노
# 문제 설명
# 머쓱이는 추운 날에도 아이스 아메리카노만 마십니다.
# 아이스 아메리카노는 한잔에 5,500원입니다.
# 머쓱이가 가지고 있는 돈 money가 매개변수로 주어질 때,
# 머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 남는 돈을 순서대로 담은 배열을
# return 하도록 solution 함수를 완성해보세요.
# 제한사항
# 0 < money ≤ 1,000,000
def solution(money):
return [money//5500, money%5500]
간단한 1차 방정식을 코드로 나타내봤다.
# 1차 방정식으로 문제를 먼저 확인
# money = 5500 * x + y
# x = 최대로 마실 수 있는 아메리카노의 잔 수
# y = 남는 돈
문제 3 : https://school.programmers.co.kr/learn/courses/30/lessons/120910
# 세균 증식
# 문제 설명
# 어떤 세균은 1시간에 두배만큼 증식한다고 합니다.
# 처음 세균의 마리수 n과 경과한 시간 t가 매개변수로 주어질 때
# t시간 후 세균의 수를 return하도록 solution 함수를 완성해주세요.
# 제한사항
# 1 ≤ n ≤ 10
# 1 ≤ t ≤ 15
def solution(n,t):
return n*2**t
이 문제도 간단한 등비수열 문제였다.
팀원은 while을 사용해서 문제를 풀었는데 t가 정수로만 주어진다면 문제없어 보인다
def solution(n, t):
answer = 0
while t > 0:
t -= 1
n *= 2
answer = n
return answer
문제 4 : https://school.programmers.co.kr/learn/courses/30/lessons/120823
# 직각삼각형 출력하기
# 문제 설명
# "*"의 높이와 너비를 1이라고 했을 때, "*"을 이용해 직각 이등변 삼각형을 그리려고합니다.
# 정수 n 이 주어지면 높이와 너비가 n 인 직각 이등변 삼각형을 출력하도록 코드를 작성해보세요.
# 제한사항
# 1 ≤ n ≤ 10
n = int(input())
for i in range(1,n+1): print('*'*i)
처음에 문제가 이해가 잘 되지 않았었지만 결국 첫줄엔 하나
두번째 줄엔 둘... 이렇게 출력하면 된다는 것을 알고 금방 했다
range를 쓸 때 주의해야 할 점은 시작범위를 정해주지 않으면 0부터 시작한다는 점이다.
시작범위가 0이면 위 코드에선 print()가 출력되서 오답이 뜬다.
또 다르게 푸는 방법을 생각해 보았다.
# for문으로 answer에 값을 저장하는 방법
n = int(input())
answer=''
for i in range(1,n+1):
answer += '*'*i + '\n'
print(answer)
# while문을 사용해 출력하는 방법
n = int(input())
count=1
a=""
while count<=n:
a+= "*"*count+"\n"
count+=1
print(a)
팀원들과 코드리뷰를 하며 느끼는 점은 각자 생각이 다른만큼 코드도 다르게 나온다는 점이다.
그부분이 한문제를 봐도 4가지 풀이가 나오니 코딩테스트 후 코드리뷰를 안 할수가 없다.