[TIL]_2025.03.13 본캠프 25일차 (1): 코드카타 Python

JIYUU·2025년 3월 13일

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

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

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

def solution(s):
    num_words = ['zero',
               'one',
               'two',
               'three',
               'four',
               'five',
               'six',
               'seven',
               'eight',
               'nine'
               ]
    if s.isnumeric():
        answer = s
    else:
        for w in num_words:
            s = s.replace(w, str(num_words.index(w)))
            answer = s
    
    return int(answer)

# .isnumeric이 True, 숫자로만 이루어져 있으면 s 반환
# .isnumeric이 False면 replace로 각 영단어를 숫자(str)로 변경

코드를 작성하면서도 뭔가 딕셔너리로 풀 수 있을 것 같다는 생각이 들었다. Key와 그에 대응하는 value가 있기 때문이다.
다른 사람들의 풀이를 살펴보니 역시 딕셔너리로 푼 경우가 있었다.
replace에 key와 value를 넣을 생각을 못했고, for문에 변수를 두개를 넣는 게 익숙하지 않아서 바로 생각나지 않았다.
앞으로 많은 데이터를 다루면서 딕셔너리를 사용할 경우가 많을 예정인데,
for문에 딕셔너리를 사용하는 방법을 잘 기억해둬야겠다.

num_dic = {"zero":"0", "one":"1", "two":"2", "three":"3", "four":"4", "five":"5", "six":"6", "seven":"7", "eight":"8", "nine":"9"}

def solution(s):
    answer = s
    for key, value in num_dic.items():
        answer = answer.replace(key, value)
    return int(answer)

참고자료 : https://ooyoung.tistory.com/77

47번. 문자열 내 마음대로 정렬하기
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

제한 조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
def solution(strings, n):
    answer = sorted(strings, key = lambda x: (x[n], x))
    return answer

lambda는 다른 함수의 인자로서 작동할 수 있다.
참고 자료 : https://velog.io/@euisuk-chung/파이썬-시각화-마스터하기-람다Lambda-함수

map(), sorted(), filter(), reduce()와 함께 사용 가능하다.
sorted()와 함께 사용하는 경우에는 정렬 기준을 지정할 수 있다.
sorted()의 기본 문법은 아래와 같이, key와 reverse를 지정할 수 있다.

sorted(iterable, key=None, reverse=False)

위의 예시에서는 strings를 인수로 받아서, key라는 매개변수로 정렬의 기준을 지정할 수 있다. 그 후에 strings의 인덱스 n으로 지정된 문자열의 n번째 문자 기준으로 정렬하고, n번째 문자가 같다면 사전순으로 전체 문자열인 x로 정렬된다.

48번. K번째 수
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

array의 2(1)번째부터 5(4)번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

입출력 예

def solution(array, commands):
    answer = []
    
    for c in commands:
        spliced_arr = array[(c[0]-1):c[1]]
        spliced_arr.sort()
        answer.append((spliced_arr[c[2]-1]))
        
    return answer

0개의 댓글