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
반응형