코딩한걸음
728x90
반응형

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


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

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

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

<python />
# 콜라츠 추측 # 문제 설명 # 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

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


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

<python />
# 추억 점수 # 문제 설명 # 사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. # 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. # 예를 들어 사진 속 인물의 이름이 ["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

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

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


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

<python />
# 대충 만든 자판 # 문제 설명 # 휴대폰의 자판은 컴퓨터 키보드 자판과는 다르게 하나의 키에 여러 개의 문자가 # 할당될 수 있습니다. 키 하나에 여러 문자가 할당된 경우, 동일한 키를 연속해서 # 빠르게 누르면 할당된 순서대로 문자가 바뀝니다. # 예를 들어, 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문 바로 써먹을 수 있어서 좋았다


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

<python />
# 삼각형의 완성조건 (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

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