코딩한걸음
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
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!