728x90
반응형
코딩 테스트 문제풀이의 목표
- 코딩 테스트 문제풀이를 하며 알고리즘에 대한 이해도를 높힌다
- 팀원들과 코드 리뷰를 하며 해당 코드를 짠 구체적인 이유를 제시한다
- https://github.com/raoneli1013/codingtest
문제 1 : https://school.programmers.co.kr/learn/courses/30/lessons/86491
# https://school.programmers.co.kr/learn/courses/30/lessons/86491
# 최소직사각형
# 문제 설명
# 명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다.
# 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서,
# 작아서 들고 다니기 편한 지갑을 만들어야 합니다.
# 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의
# 가로 길이와 세로 길이를 조사했습니다.
# 아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
# 명함 번호 가로 길이 세로 길이
# 1 60 50
# 2 30 70
# 3 60 30
# 4 80 40
# 가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에
# 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다.
# 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로
# 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.
# 모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로
# 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때,
# 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
# 제한사항
# sizes의 길이는 1 이상 10,000 이하입니다.
# sizes의 원소는 [w, h] 형식입니다.
# w는 명함의 가로 길이를 나타냅니다.
# h는 명함의 세로 길이를 나타냅니다.
# w와 h는 1 이상 1,000 이하인 자연수입니다.
sizes = [[60, 50], [30, 70], [60, 30], [80, 40]]
answer = 0
w = 0
h = 0
for i in sizes:
# 각 요소의 0,1인덱스를 비교해서 큰놈을 a, 작은놈을 b로 정렬
if i[0]<i[1]: i=[i[1],i[0]]
# w은 i[0], h는 i[1]의 최대값을 저장
if w < i[0] : w = i[0]
if h < i[1] : h = i[1]
answer = w*h
print(answer)
# 제출용 함수
def solution(sizes):
answer = 0
w = 0
h = 0
for i in sizes:
if i[0]<i[1]: i=[i[1],i[0]]
if w < i[0] : w = i[0]
if h < i[1] : h = i[1]
answer = w*h
return answer
문제 2 : https://school.programmers.co.kr/learn/courses/30/lessons/155652
# https://school.programmers.co.kr/learn/courses/30/lessons/155652
# 둘만의 암호
# 문제 설명
# 두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라
# 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.
# 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.
# index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
# skip에 있는 알파벳은 제외하고 건너뜁니다.
# 예를 들어 s = "aukks", skip = "wbqd", index = 5일 때,
# a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서
# 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고
# 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다.
# 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다.
# 두 문자열 s와 skip, 그리고 자연수 index가 매개변수로 주어질 때
# 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해주세요.
# 제한사항
# 5 ≤ s의 길이 ≤ 50
# 1 ≤ skip의 길이 ≤ 10
# s와 skip은 알파벳 소문자로만 이루어져 있습니다.
# skip에 포함되는 알파벳은 s에 포함되지 않습니다.
# 1 ≤ index ≤ 20
s = 'aukks'
skip = 'wbqd'
index = 5
# result = 'happy'
# ord()
skip_askii=[ord(i) for i in skip]
answer = ''
for i in s:
alp = ord(i)
moves = 0
while moves < index:
alp+=1
if alp>122: alp-=26
if alp not in skip_askii:
moves+=1
answer += chr(alp)
print(answer)
# 제출용 함수
def solution(s, skip, index):
skip_askii=[ord(i) for i in skip]
answer = ''
for i in s:
alp = ord(i)
moves = 0
while moves < index:
alp+=1
if alp>122: alp-=26
if alp not in skip_askii:
moves+=1
answer += chr(alp)
return answer
문제 3 : https://school.programmers.co.kr/learn/courses/30/lessons/86491
# https://school.programmers.co.kr/learn/courses/30/lessons/133502
# 햄버거 만들기
# 문제 설명
# 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인
# 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에
# 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며,
# 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.
# 예를 들어, 상수의 앞에 쌓이는 재료의 순서가
# [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때,
# 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여
# 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터
# 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.
# 상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때,
# 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.
# 제한사항
# 1 ≤ ingredient의 길이 ≤ 1,000,000
# ingredient의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.
ingredient = [2, 1, 1, 2, 3, 1, 2, 3, 1]
# result = 2
arr = []
answer = 0
for i in ingredient:
arr.append(i)
if i == 1:
if arr[-4:]==[1,2,3,1]:
del arr[-4:]
answer+=1
print(answer)
def solution(ingredient):
arr = []
answer = 0
for i in ingredient:
arr.append(i)
if i == 1:
if arr[-4:]==[1,2,3,1]:
del arr[-4:]
answer+=1
return answer
문제 4 : https://school.programmers.co.kr/learn/courses/30/lessons/118666
# https://school.programmers.co.kr/learn/courses/30/lessons/118666
# 성격 유형 검사하기
# 문제 설명
# 지표 번호 성격 유형
# 1번 지표 라이언형(R), 튜브형(T)
# 2번 지표 콘형(C), 프로도형(F)
# 3번 지표 제이지형(J), 무지형(M)
# 4번 지표 어피치형(A), 네오형(N)
# 각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.
# 하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.
# 검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서
# 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다.
# 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중
# 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.
# 질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가
# 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가
# 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를
# 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.
# 제한사항
# 1 ≤ survey의 길이 ( = n) ≤ 1,000
# survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
# survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
# survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
# choices의 길이 = survey의 길이
# choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
# 1 ≤ choices의 원소 ≤ 7
# choices 뜻
# 1 매우 비동의
# 2 비동의
# 3 약간 비동의
# 4 모르겠음
# 5 약간 동의
# 6 동의
# 7 매우 동의
survey = ["AN", "CF", "MJ", "RT", "NA"]
choices = [5, 3, 2, 7, 5]
result = [5, 3, 2, 7, 5]
answer = ''
dic = {'R':0,'T':0,'C':0,'F':0,'J':0,'M':0,'A':0,'N':0}
for i in range(0,len(survey)):
if choices[i] < 4:
dic[survey[i][0]] += 4-choices[i]
elif choices[i] > 4:
dic[survey[i][1]] += choices[i]-4
arr = ['RT','CF','JM','AN']
for i in arr:
if dic[i[0]]>=dic[i[1]]: answer+=i[0]
else: answer+=i[1]
print(answer)
# 제출용 함수
def solution(survey, choices):
answer = ''
dic = {'R':0,'T':0,'C':0,'F':0,'J':0,'M':0,'A':0,'N':0}
for i in range(0,len(survey)):
if choices[i] < 4:
dic[survey[i][0]] += 4-choices[i]
elif choices[i] > 4:
dic[survey[i][1]] += choices[i]-4
arr = ['RT','CF','JM','AN']
for i in arr:
if dic[i[0]]>=dic[i[1]]: answer+=i[0]
else: answer+=i[1]
return answer
728x90
반응형