• 문제

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

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

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를 설정 해놓고, 완성되면 리셋하는 로직 잘 사용하자
  • 문제

얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 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