728x90
반응형
코딩 테스트 Coding Test 와 코드 리뷰 Code Review
코딩 테스트 문제풀이의 목표
- 코딩 테스트 문제풀이를 하며 알고리즘에 대한 이해도를 높힌다
- 팀원들과 코드 리뷰를 하며 해당 코드를 짠 구체적인 이유를 제시한다
문제 1 : https://school.programmers.co.kr/learn/courses/30/lessons/120839
# 가위 바위 보
# 문제 설명
# 가위는 2 바위는 0 보는 5로 표현합니다.
# 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때,
# rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을
# return하도록 solution 함수를 완성해보세요.
# 제한사항
# 0 < rsp의 길이 ≤ 100
# rsp와 길이가 같은 문자열을 return 합니다.
# rsp는 숫자 0, 2, 5로 이루어져 있습니다.
def solution(rsp):
answer = ''
for i in rsp:
if i=="0": answer+="5"
elif i=="2": answer+="0"
else: answer+="2"
return answer
replace를 써볼까도 했지만 0 > 5, 5 > 2, 2 > 0 으로 바꾸는걸 한번에 해야하는데
그 부분이 하드코딩 될거 같아서 그냥 편하게 for문으로 해결했다.
문제 2 : https://school.programmers.co.kr/learn/courses/30/lessons/120894
# 영어가 싫어요
# 문제 설명
# 영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다.
# 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔
# return 하도록 solution 함수를 완성해 주세요.
# 제한사항
# numbers는 소문자로만 구성되어 있습니다.
# numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" 들이 공백 없이 조합되어 있습니다.
# 1 ≤ numbers의 길이 ≤ 50
# "zero"는 numbers의 맨 앞에 올 수 없습니다.
# replace 사용
def solution(numbers):
tr_numbers = numbers.replace("one","1").replace("two","2").replace("three","3").replace("four","4").replace("five","5").replace("six","6").replace("seven","7").replace("eight","8").replace("nine","9").replace("zero","0")
answer = int(tr_numbers)
return answer
처음에 코드를 이렇게 했는데 아무리생각해도 너무 하드코딩인거같아서
for문을 사용해봤다
# for + replace 사용
def solution(numbers):
number_list = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
for idx, number in enumerate(number_list):
numbers = numbers.replace(number,str(idx))
answer = int(numbers)
return answer
number_list 를 인덱스에 맞춰서 정의를 해주고 for문과 enumerate를 사용해서
각 문자열과 인덱스번호를 가져온 후 replace안에 넣어줌.
이 때 인덱스번호는 type: int라서 str함수를 이용해 str로 바꿔줘야 했다
문제 3 : https://school.programmers.co.kr/learn/courses/30/lessons/120818
# 옷가게 할인 받기
# 문제 설명
# 머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%,
# 50만 원 이상 사면 20%를 할인해줍니다.
# 구매한 옷의 가격 price가 주어질 때,
# 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.
# 제한사항
# 10 ≤ price ≤ 1,000,000
# price는 10원 단위로(1의 자리가 0) 주어집니다.
# 소수점 이하를 버린 정수를 return합니다.
def solution(price):
answer=price
if 300000>price>=100000: answer = price*0.95
elif 500000>price>=300000: answer = price*0.9
elif price>=500000: answer = price*0.8
return int(answer)
처음에 짠 코드는 이거였는데 조금 더 깔끔하게 할 수 있을거같아서
# 조금 더 깔끔하게?
def solution(price):
dc=1
if price>=100000 : dc=0.95
if price>=300000 : dc=0.9
if price>=500000 : dc=0.8
answer = int(price*dc)
return answer
이렇게 바꿔보았다. 근데 생각해보니 if문 3개 돌리는것보다 팀원들이 푼 방식이 깔끔해 보였다
def solution(price):
answer = 0
if price >= 500000:
price = price * 0.8
elif price >= 300000:
price = price * 0.9
elif price >= 100000:
price = price * 0.95
answer = int(price)
return answer
문제 4 : https://school.programmers.co.kr/learn/courses/30/lessons/120897
# 약수 구하기
# 문제 설명
# 정수 n이 매개변수로 주어질 때,
# n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
# 제한사항
# 1 ≤ n ≤ 10,000
def solution(n):
answer = []
for i in range(1,n+1):
if n%i==0: answer.append(i)
return answer
간단한 문제여서 팀원들도 모두 같은 코드를 썼다
하지만 한가지 마음에 들지 않았던 부분은 range의 범위였다
for문은 기본적으로 리소스를 많이 먹기때문에 range의 범위를 줄일 수 있다면 줄이는게 좋다
그럼 range를 얼마나 줄일 수 있을까 생각해보면
a = b*c에서 b=c일때, 즉 제곱근까지만 하면 range 범위를 줄일 수 있다.
def solution(n):
answer = []
for i in range(1,int(n**(1/2)+1)):
if n%i==0:
answer.append(i)
if i!=n//i: answer.append(n//i)
answer.sort()
return answer
이 방법은 주어진 수가 커질수록 위 코드방식보다 리소스를 덜 먹는다
100000000의 약수를 찾는데 전자는 100000000번 for문을 돌려야 하지만
후자는 10000번만돌리면 되기 때문. 이는 엄청난 차이다
728x90
반응형