코딩한걸음
728x90
반응형

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


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

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

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

# 콜라츠 추측

# 문제 설명
# 1937년 Collatz란 사람에 의해 제기된 이 추측은, 
# 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 
# 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

# 1-1. 입력된 수가 짝수라면 2로 나눕니다. 
# 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
# 2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. 
# 예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 
# 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, 
# solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 
# 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

# 제한 사항
# 입력된 수, num은 1 이상 8,000,000 미만인 정수입니다.

n = 6

answer = 0
# 문제 조건에 따라 while문 만들기 
while n!=1 and answer < 500:
    if n%2==0:
        n /=2
        answer+=1
    else: 
        n = 3*n+1
        answer+=1
    if answer==500: answer = -1
print(answer)

# 제출용 함수
def solution(n):
    answer = 0
    while n!=1 and answer < 500:
        if n%2==0:
            n /=2
            answer+=1
        else: 
            n = 3*n+1
            answer+=1
    if answer==500: answer = -1
    return answer

딱히 어려울것 없는 문제였는데 뭔가 하드코딩한 느낌이다


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

# 추억 점수

# 문제 설명
# 사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 
# 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 
# 예를 들어 사진 속 인물의 이름이 ["may", "kein", "kain"]이고 
# 각 인물의 그리움 점수가 [5점, 10점, 1점]일 때 
# 해당 사진의 추억 점수는 16(5 + 10 + 1)점이 됩니다. 
# 다른 사진 속 인물의 이름이 ["kali", "mari", "don", "tony"]이고
# ["kali", "mari", "don"]의 그리움 점수가 각각 [11점, 1점, 55점]]이고, 
# "tony"는 그리움 점수가 없을 때, 이 사진의 추억 점수는 
# 3명의 그리움 점수를 합한 67(11 + 1 + 55)점입니다.

# 그리워하는 사람의 이름을 담은 문자열 배열 name, 
# 각 사람별 그리움 점수를 담은 정수 배열 yearning, 
# 각 사진에 찍힌 인물의 이름을 담은 이차원 문자열 배열 photo가 매개변수로 주어질 때,
# 사진들의 추억 점수를 photo에 주어진 순서대로 배열에 담아 
# return하는 solution 함수를 완성해주세요.

# 제한사항
# 3 ≤ name의 길이 = yearning의 길이≤ 100
# 3 ≤ name의 원소의 길이 ≤ 7
# name의 원소들은 알파벳 소문자로만 이루어져 있습니다.
# name에는 중복된 값이 들어가지 않습니다.
# 1 ≤ yearning[i] ≤ 100
# yearning[i]는 i번째 사람의 그리움 점수입니다.
# 3 ≤ photo의 길이 ≤ 100
# 1 ≤ photo[i]의 길이 ≤ 100
# 3 ≤ photo[i]의 원소(문자열)의 길이 ≤ 7
# photo[i]의 원소들은 알파벳 소문자로만 이루어져 있습니다.
# photo[i]의 원소들은 중복된 값이 들어가지 않습니다.

name = ["may", "kein", "kain", "radi"]
yearning = [5, 10, 1, 3]
photo = [["may", "kein", "kain", "radi"],
         ["may", "kein", "brin", "deny"], 
         ["kon", "kain", "may", "coni"]]

# 변수 정의
answer = []
dic = {}
# name과 yearning은 길이가 같음,
# name과 yearning으로 인덱스 기준 딕셔너리 만듬
for i in range(len(name)):
    dic[name[i]] = yearning[i]

# photo가 2차원 list니깐 for 2개 사용
for pic in photo:
    # 더할 변수 sum 정의 및 초기화
    sum = 0
    for friend in pic:
        # friend가 name에 존재하면 sum
        if friend in name: sum+=dic[friend]
    # for문을 빠져나온 sum을 answer에 추가
    answer.append(sum)

print(answer)

# 제출용 함수
def solution(name, yearning, photo):
    answer = []
    dic = {}
    for i in range(len(name)):
        dic[name[i]] = yearning[i]
    for pic in photo:
        sum = 0
        for friend in pic:
            if friend in name: sum+=dic[friend]
        answer.append(sum)
    return answer

따끈따끈한 신작 문제 !! 바로 풀어봤는데 생각보다 어렵진 않았다

요즘 딕셔너리를 활용한 풀이를 많이 적용하고있는데 생각보다 더 효율이 좋다


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

# 대충 만든 자판

# 문제 설명
# 휴대폰의 자판은 컴퓨터 키보드 자판과는 다르게 하나의 키에 여러 개의 문자가 
# 할당될 수 있습니다. 키 하나에 여러 문자가 할당된 경우, 동일한 키를 연속해서 
# 빠르게 누르면 할당된 순서대로 문자가 바뀝니다.
# 예를 들어, 1번 키에 "A", "B", "C" 순서대로 문자가 할당되어 있다면 
# 1번 키를 한 번 누르면 "A", 두 번 누르면 "B", 세 번 누르면 "C"가 되는 식입니다.
# 같은 규칙을 적용해 아무렇게나 만든 휴대폰 자판이 있습니다. 
# 이 휴대폰 자판은 키의 개수가 1개부터 최대 100개까지 있을 수 있으며, 
# 특정 키를 눌렀을 때 입력되는 문자들도 무작위로 배열되어 있습니다. 
# 또, 같은 문자가 자판 전체에 여러 번 할당된 경우도 있고, 
# 키 하나에 같은 문자가 여러 번 할당된 경우도 있습니다. 
# 심지어 아예 할당되지 않은 경우도 있습니다. 
# 따라서 몇몇 문자열은 작성할 수 없을 수도 있습니다.
# 이 휴대폰 자판을 이용해 특정 문자열을 작성할 때, 
# 키를 최소 몇 번 눌러야 그 문자열을 작성할 수 있는지 알아보고자 합니다.
# 1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열배열 keymap과 
# 입력하려는 문자열들이 담긴 문자열 배열 targets가 주어질 때, 
# 각 문자열을 작성하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 
# return 하는 solution 함수를 완성해 주세요.
# 단, 목표 문자열을 작성할 수 없을 때는 -1을 저장합니다.

# 제한사항
# 1 ≤ keymap의 길이 ≤ 100
# 1 ≤ keymap의 원소의 길이 ≤ 100
# keymap[i]는 i + 1번 키를 눌렀을 때 순서대로 바뀌는 문자를 의미합니다.
# 예를 들어 keymap[0] = "ABACD" 인 경우 1번 키를 한 번 누르면 A, 두 번 누르면 B, 세 번 누르면 A 가 됩니다.
# keymap의 원소의 길이는 서로 다를 수 있습니다.
# keymap의 원소는 알파벳 대문자로만 이루어져 있습니다.
# 1 ≤ targets의 길이 ≤ 100
# 1 ≤ targets의 원소의 길이 ≤ 100
# targets의 원소는 알파벳 대문자로만 이루어져 있습니다.

keymap = ["AA"]
targets = 	["B"]

# 필요한 애들 정의
answer = []
dic = {}
# keymap 해체쇼
for i in keymap:
    # enumerate을 사용해서 딕셔너리 만들기
    for idx,value in enumerate(i):
        # value값이 dic에 있을경우 값 비교해서 작으면 넣음
        if value in dic.keys():
            if dic[value] > idx+1: dic[value] = idx+1
        else: dic[value] = idx+1
# targets 해체쇼
for i in targets:
    # sum정의 및 초기화
    sum=0
    for j in i:
        # j값이 dic에 없으면 answer에 -1넣고 브레이크
        if j not in dic.keys():
            answer.append(-1)
            break
        sum+=dic[j]
    # 위 for문에서 break 안걸리면 else문 작동
    else: answer.append(sum)
print(answer)

# 제출용 함수
def solution(keymap, targets):
    answer = []
    dic = {}
    for i in keymap:
        for idx,value in enumerate(i):
            if value in dic.keys():
                if dic[value] > idx+1: dic[value] = idx+1
            else: dic[value] = idx+1
    for i in targets:
        sum=0
        for j in i:
            if j not in dic.keys():
                answer.append(-1)
                break
            sum+=dic[j]
        else: answer.append(sum)
    return answer

오늘 배운 for - else문 바로 써먹을 수 있어서 좋았다


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

# 삼각형의 완성조건 (1)

# 문제 설명
# 선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

# 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
# 삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 
# 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 
# solution 함수를 완성해주세요.

# 제한사항
# sides의 원소는 자연수입니다.
# sides의 길이는 3입니다.
# 1 ≤ sides의 원소 ≤ 1,000


sides = [1, 2, 3]

# 일단 sort로 오름차순 정리
sides.sort()

# 조건 : 가장 긴 변 < 다른 두변 합
if sides[-1] >= sides[0]+sides[1] : answer = 2
else : answer = 1

# 코드 줄이기
answer = 2 if sides[-1] >= sides[0]+sides[1] else 1

# 제출용 함수
def solution(sides):
    sides.sort()
    answer = 2 if sides[-1] >= sides[0]+sides[1] else 1
    return answer

코드줄이는 연습 중

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

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