코딩한걸음
728x90
반응형

코딩 테스트 Coding Test 와 코드 리뷰 Code Review


코딩 테스트 문제풀이의 목표

  • 코딩 테스트 문제풀이를 하며 알고리즘에 대한 이해도를 높힌다
  • 팀원들과 코드 리뷰를 하며 해당 코드를 짠 구체적인 이유를 제시한다
  • https://github.com/raoneli1013/codingtest

문제 1 : https://school.programmers.co.kr/learn/courses/30/lessons/77884

# 약수의 개수와 덧셈

# 문제 설명
# 두 정수 left와 right가 매개변수로 주어집니다. 
# left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 
# 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

# 제한사항
# 1 ≤ left ≤ right ≤ 1,000

left = 13
right = 17
# result = 43

# 약수의 갯수 구하기
def find_divisor(number):
    count = 0
    # 시간복잡도 낮추기 위해 제곱근까지만 실행
    for i in range(1,int(number**(1/2))+1):
        # i가 제곱근이면 count+1
        if number == i**2: count+=1
        elif number%i==0: count+=2
    return count

answer = 0
for i in range(left,right+1):
    if find_divisor(i)%2 == 0: answer+=i
    else: answer-=i
print(answer)

# 제출용 함수
def solution(left, right):
    answer = 0
    for i in range(left,right+1):
        if find_divisor(i)%2 == 0: answer+=i
        else: answer-=i
    return answer

요즘 코딩테스트에서도 함수를 활용해서 문제푸는 중

코드를 그나마 깔끔하게 정리할 수 있어서 보기 좋다


문제 2 : https://school.programmers.co.kr/learn/courses/30/lessons/12950

# 행렬의 덧셈

# 문제 설명
# 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 
# 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 
# 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

# 제한 조건
# 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

arr1 = [[1,2],[2,3]]
arr2 = [[3,4],[5,6]]
# return = [[4,6],[7,9]]

# 변수 정의
answer = []
rows = len(arr1)
columns = len(arr1[0])

# rows / columns 만큼 반복 2차월 배열이라 for 두번
for i in range(rows):
    #각 rows를 구별해줄 arr 정의 및 초기화
    arr=[]
    for j in range(columns):
        arr.append(arr1[i][j]+arr2[i][j])
    answer.append(arr)

print(answer)

# 제출용 함수
def solution(arr1, arr2):
    answer = []
    rows = len(arr1)
    columns = len(arr1[0])

    for i in range(rows):
        arr=[]
        for j in range(columns):
            arr.append(arr1[i][j]+arr2[i][j])
        answer.append(arr)
    return answer

 


문제 3 : https://school.programmers.co.kr/learn/courses/30/lessons/12940

# 최대공약수와 최소공배수

# 문제 설명
# 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, 
# solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 
# 그다음 최소공배수를 넣어 반환하면 됩니다. 
# 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 
# solution(3, 12)는 [3, 12]를 반환해야 합니다.

# 제한 사항
# 두 수는 1이상 1000000이하의 자연수입니다.

n = 3
m = 12
# return [3, 12]

answer = []
# 최대공약수 구하기
# 내림차순으로 range를 정해주고 두 수 다 나누어떨어지면 최대공약수
for i in range(min(n,m),0,-1):
    if n%i == 0 and m%i ==0 : 
        answer.append(i)
        break

# 최소공배수 구하기
# 오름차순으로 range를 정해주고 두 수로 나누어 떨어지면 최소공배수
for i in range(max(n,m),n*m+1):
    if i%n == 0 and i%m == 0 :
        answer.append(i)
        break

print(answer)

# 제출용 함수
def solution(n, m):
    answer = []
    for i in range(min(n,m),0,-1):
        if n%i == 0 and m%i ==0 : 
            answer.append(i)
            break
    for i in range(max(n,m),n*m+1):
        if i%n == 0 and i%m == 0 :
            answer.append(i)
            break
    return answer

직접 손으로 최대공약수, 최소공배수 구하려면 소인수분해 하는게 귀찮았는데

코드로 하면 그냥 for문으로 돌려버리면 그만이니깐 편하다

 


문제 4 : https://school.programmers.co.kr/learn/courses/30/lessons/68935

# 문제 설명
# 자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 
# 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

# 제한사항
# n은 1 이상 100,000,000 이하인 자연수입니다.

n = 125
# result = 7

# 재귀함수로 3진법 > 10진법 후 리버스
def dec_to_tri_reversed(number,str_tri=''):
    if number==0: return str_tri
    return dec_to_tri_reversed(number//3,str_tri+str(number%3))

# 재귀함수로 3진법 > 10진법
def tri_to_dec(str_tri, number=0,idx=0):
    if idx==len(str_tri): return number
    return tri_to_dec(str_tri, number+(3**idx)*int(str_tri[len(str_tri)-idx-1]),idx+1)

answer = tri_to_dec(dec_to_tri_reversed(n), number=0,idx=0)

print(answer)

# 제출용 함수
def solution(n):
    answer = tri_to_dec(dec_to_tri_reversed(n), number=0,idx=0)
    return answer

재귀함수 쓰니깐 10진법을 변환하는게 너무 쉬워졌다

이런식으로 자주 쓰다보면 재귀함수에도 익숙해지겠지

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

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