코딩한걸음
728x90
반응형

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


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

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

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

# 인덱스 바꾸기

# 문제 설명
# 문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, 
# my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 
# return 하도록 solution 함수를 완성해보세요.

# 제한사항
# 1 < my_string의 길이 < 100
# 0 ≤ num1, num2 < my_string의 길이
# my_string은 소문자로 이루어져 있습니다.
# num1 ≠ num2

my_string = "I love you"
num1 = 3
num2 = 6

# for문사용
answer = ''
for idx in range(len(my_string)):
    if idx==num1: idx = num2
    elif idx==num2: idx = num1
    answer += my_string[idx]
print(answer)

# 제출용 함수
def solution(my_string, num1, num2):
    answer = ''
    for idx in range(len(my_string)):
        if idx==num1: idx = num2
        elif idx==num2: idx = num1
        answer += my_string[idx]
    return answer

 


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

# 캐릭터의 좌표

# 문제 설명
# 머쓱이는 RPG게임을 하고 있습니다. 
# 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 
# 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 
# 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], 
# down을 누른다면 [0, -1], left를 누른다면 [-1, 0], 
# right를 누른다면 [1, 0]입니다. 
# 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 
# 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 
# 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.

# [0, 0]은 board의 정 중앙에 위치합니다. 
# 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 
# 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.

# 제한사항
# board은 [가로 크기, 세로 크기] 형태로 주어집니다.
# board의 가로 크기와 세로 크기는 홀수입니다.
# board의 크기를 벗어난 방향키 입력은 무시합니다.
# 0 ≤ keyinput의 길이 ≤ 50
# 1 ≤ board[0] ≤ 99
# 1 ≤ board[1] ≤ 99
# keyinput은 항상 up, down, left, right만 주어집니다.


keyinput = ["left", "right", "up", "right", "right"]
board = [11, 11]

board_width = board[0]//2
board_hight = board[1]//2
# 입력 - 동작값 딕셔너리
keyinput_dic = {"up":[0,1], "down":[0,-1], "left":[-1,0], "right":[1,0]}
answer = [0,0]
for i in keyinput:
    # board가 넘어가지 않도록 조건 설정
    if board_width >= answer[0]+keyinput_dic[i][0] >= -board_width :
        answer[0] += keyinput_dic[i][0]
    if board_hight >= answer[1]+keyinput_dic[i][1] >= -board_hight :
        answer[1] += keyinput_dic[i][1]
print(answer)

# 제출용 함수
def solution(keyinput, board):
    board_width = board[0]//2
    board_hight = board[1]//2
    keyinput_dic = {"up":[0,1], "down":[0,-1], "left":[-1,0], "right":[1,0]}
    answer = [0,0]

    for i in keyinput:
        if board_width >= answer[0]+keyinput_dic[i][0] >= -board_width :
            answer[0] += keyinput_dic[i][0]
        if board_hight >= answer[1]+keyinput_dic[i][1] >= -board_hight :
            answer[1] += keyinput_dic[i][1]
    return answer

 


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

# 배열 만들기 2

# 문제 설명
# 정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만
# 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 
# solution 함수를 완성해 주세요.

# 만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.

l = 10
r = 20

answer = []
for i in range(l,r+1):
    if str(i).replace('5','').replace('0','')=='': answer.append(i)
if answer == []: answer.append(-1)
print(answer)

 


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

# https://school.programmers.co.kr/learn/courses/30/lessons/131128
# 숫자 짝꿍

# 문제 설명
# 두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여
# 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다
# (단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다) 
# X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. 
# X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

# 예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 
# 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 
# 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 
# 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다
# (X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
# 두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 
# solution 함수를 완성해주세요.

# 제한사항
# 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
# X, Y는 0으로 시작하지 않습니다.
# X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

X = "100"
Y = "203045"

answer = ''
arr_x = [0]*10
arr_y = [0]*10
for i in X: 
    arr_x[int(i)]+=1
for i in Y: 
    arr_y[int(i)]+=1
for i in range(0,10):
    answer = str(i)*(min(arr_x[i],arr_y[i])) + answer
if answer == '': answer = '-1'
elif answer.replace('0','') == '': answer = '0'

print(answer)

# 제출용 함수
def solution(X, Y):
    answer = ''
    arr_x = [0]*10
    arr_y = [0]*10
    for i in X: 
        arr_x[int(i)]+=1
    for i in Y: 
        arr_y[int(i)]+=1
    for i in range(0,10):
        answer = str(i)*(min(arr_x[i],arr_y[i])) + answer
    if answer == '': answer = '-1'
    elif answer.replace('0','') == '': answer = '0'
    return answer

문제자체는 어렵지 않았지만 계속 시간초과에 걸렸던 문제.

for문을 어떻게 하면 최대한 줄일 수 있을까 고민을 많이 했다.

count나 index, list 등 여러가지 메소드를 쓰는것도 겉으로 보이진 않지만 시간복잡도가 있기 때문에

코테할때는 그런부분도 신경써야겠다.

 

 

 

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

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