코딩한걸음
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
반응형
profile

코딩한걸음

@Joonyeol_Yoon

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