• 문제

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.

 

  • 답안
def solution(numbers):
    len_num = len(numbers)

    cnt = 0
    for i in range(len_num):
        for j in range(i+1, len_num):
            for k in range(j+1, len_num):
                if numbers[i] + numbers[j] + numbers[k] == 0:
                    cnt += 1

    return cnt

 

 

  • 이 문제의 키워드
    • 리스트의 길이가 3부터 13까지로 정해져있으므로 완전탐색해도 시간복잡도 기준에 위배되지 않는 상황
    • 시간 복잡도가 크지 않다면 완전탐색(brutal force)으로 해결
    • 조합 combinations를 활용할 수도 있겠지만 이점 많지 않음
  • 문제

햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.

예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.

상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.

 

  • 답안
def solution(ingredient):
    answer = 0
    stack = []
    
    for i in ingredient:
        stack.append(i)
        if stack[-4:] == [1, 2, 3, 1]:
            answer += 1
            for _ in range(4):
                stack.pop()
    
    return answer

 

 

  • 이 문제 키워드
    • 리스트 원소의 나열이 특정 조건을 만족하면 처리하도록 할 때, stack 구조 활용
    • 만족하는 경우를 제외하고 나머지를 고려하고 싶을 때, pop()으로 제거
    • stack에서 또 for문을 쓰는게 아니라, [-4:]와 같이 고정 인덱싱으로 조건문 확인 가능
  • 문제

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

 

  • 답안
def solution(s):
    answer = ''
    temp = ''
    num_dict = {'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4',
               'five': '5', 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9'}
    for i in s:
        if i.isdigit():
            answer += i
        else:
            temp += i
            if temp in num_dict:
                answer += num_dict[temp]
                temp = ''
    return int(answer)

 

  • 이 문제의 키워드
    • 문자열을 숫자로 변환하도록 미리 dictionary 선언
    • temp를 설정 해놓고, 완성되면 리셋하는 로직 잘 사용하자
  • 문제

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

return
"1 2 3 4" "1 4"
"-1 -2 -3 -4" "-4 -1"
"-1 -1"  "-1 -1"

 

  • 답안
def solution(s):
    answer = ''
    nums = s.split(' ')
    num_list = list(map(int, nums))
    
    min_num = min(num_list)
    max_num = max(num_list)
    
    answer = f'{min_num} {max_num}'
    return answer

 

  • 이 문제의 키워드
    • 문자열을 여러 요소로 나눈다던가, 공백을 제거해주는 과정이 필요할 때, s.split(' ') 이용하기
    • int(a), int(b) 여러번 쓸 필요없이 map(int, list) 로 한번에 처리해주자
    • map은 <map ~~> 객체로 저장되므로 list() 해주자
    • 쉽지만 문자열을 다루는 법과 map의 사용에 대해 다시 한번 생각해 볼 수 있는 문제
  • 문제

얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.

선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.

 

입출력 예
players callings result
["mumu", "soe", "poe", "kai", "mine"] ["kai", "kai", "mine", "mine"] ["mumu", "kai", "mine", "soe", "poe"]

 

  • 답안
def solution(players, callings):
    answer = []
    pl_dict = {value: idx for idx, value in enumerate(players)}
    
    for call in callings:
        ord_now = pl_dict[call]
        ord_fast = ord_now - 1 
        
        players[ord_now] = players[ord_fast] 
        players[ord_fast] = call
        
        pl_dict[call] -= 1
        pl_dict[players[ord_now]] += 1
        
    answer = players
    
    return answer

 

  • 이 문제 키워드
    • 해시로 해결하는 문제였음. 그러나, dict 는 key -> value 기능이 있지만 value -> key 조회 기능은 따로없음
    • key -> value 조회를 위해 dict를 설정하고, value -> key로 값 조회, 수정 할 때는 list에 작업
    • dict 에서 순위(value) 값에 변화를 주고, list에서 이 순위(index)를 조회해 변화를 주는 방향을 활용하자

 

  • 문제 

나만의 카카오 성격 유형 검사지를 만드려고 합니다.
성격 유형 검사는 4개의 지표에 따라 두 유형 중 하나로 결정됩니다.

 

1번 지표 라이언형(R) 튜브형(T)
2번 지표 콘형(C) 프로도형(F)
3번 지표 제이지형(J) 무지형(M)
4번 지표 어피치형(A) 네오형(N)

 

검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.


매우 비동의, 비동의, 약간 비동의, 모르겠음, 약간 동의, 동의, 매우 동의


각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.
예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.

이때 검사자가 질문에서 약간 동의 선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다. 만약 검사자가 매우 비동의 선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.

- 매우 동의나 매우 비동의 선택지를 선택하면 3점을 얻습니다.
- 동의나 비동의 선택지를 선택하면 2점을 얻습니다.
- 약간 동의나 약간 비동의 선택지를 선택하면 1점을 얻습니다.
- 모르겠음 선택지를 선택하면 점수를 얻지 않습니다.
- 검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단

 

survey choices return
['AN', 'CF', 'MJ', 'RT', 'NA'] [5, 3, 2, 7, 5] 'TCMA'
['TR', 'RT', 'TR'] [7, 1, 3] 'RCJA'

 

  • 답안
score = {'R': 0, 'T': 0, 'C': 0, 'F': 0, 'J': 0, 'M': 0, 'A': 0, 'N': 0}

def solution(survey, choices):
    answer = ''
    for s, c in zip(survey, choices):
        if c > 4:
            score[s[1]] += c - 4
        if c < 4:
            score[s[0]] += 4 - c
    
    score_li = list(score.items())
    for i in range(0, len(score)-1, 2):
        if score_li[i][1] >= score_li[i+1][1]:
            answer += score_li[i][0]
        else:
            answer += score_li[i+1][0]
        
    return answer

 

  • 이 문제 키워드
    • dict 자체로 접근까지는 어렵지 않았으나, dict.items()로 key, value를 모두 호출하고, list로 바꾸어 주어 인덱싱하는 과정이 필요했음
    • 두 가지 객체를 같이 loop 할 때, zip 사용하기, 원소와 인덱스를 같이 loop 할 때, enumerate 사용하기, dict에서 key, value를 같이 loop 할 때, dict.items() 사용하기를 기억하자
    • sort할 대상의 수가 적으면 선언할 때, 순서대로 적자
    • 문자열은 .sort()가 되지 않는다 -> sorted()는 가능
    • 문제 잘보기 -> 인덱스와 그에 해당하는 번호를 혼동하지 말자

+ Recent posts