[Python] 알고리즘 연습 10 (프로그래머스)

Lake·2024년 5월 20일

Python 문제

목록 보기
10/22
post-thumbnail

숫자 문자열과 영단어 (연습문제)

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

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

    1478 → "one4seveneight"
    234567 → "23four5six7"
    10203 → "1zerotwozero3"

    이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
    • 제한사항
      • 1 ≤ s의 길이 ≤ 50
      • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
      • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

제출한 코드 :

def solution(s):
    num_dict = {
        "zero": "0",
        "one": "1",
        "two": "2",
        "three": "3",
        "four": "4",
        "five": "5",
        "six": "6",
        "seven": "7",
        "eight": "8",
        "nine": "9"
    }
    
    import re
    
    # 영단어 목록을 정규표현식 패턴으로 변환
    pattern = re.compile("|".join(num_dict.keys()))
    
    # 정규표현식을 사용하여 영단어를 숫자로 변환
    def replace_func(match):
        return num_dict[match.group(0)]
    
    result = pattern.sub(replace_func, s) # s 문자열에서 영단어를 숫자로 변환
    
    return int(result)

문자열 내 마음대로 정렬하기 (연습문제)

  • 문자열로 구성된 리스트 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):
    return sorted(strings, key=lambda x: (x[n], x))
}

K번째수 (정렬)

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

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

    - array의 2번째부터 5번째까지 자르면 [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):
    result = []
    for command in commands:
        i, j, k = command
        # array에서 i번째부터 j번째까지 자른 후 정렬
        sliced_sorted = sorted(array[i-1:j])
        # k번째 숫자를 결과 리스트에 추가
        result.append(sliced_sorted[k-1])
    return result

두 개 뽑아서 더하기 (월간 코드 챌린지 시즌1)

  • 정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
    • 제한사항
      • numbers의 길이는 2 이상 100 이하입니다
        - numbers의 모든 수는 0 이상 100 이하입니다

제출한 코드 :

from itertools import combinations

def solution(numbers):
    sums = set()
    for a, b in combinations(numbers, 2):
        sums.add(a + b)
    return sorted(sums)

가장 가까운 글자 (연습문제)

  • 문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
    예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

    - b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
    - a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
    - n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
    - a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
    - n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
    - a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.

    따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.

  • 제한사항
    • 1 ≤ s의 길이 ≤ 10,000
    • s은 영어 소문자로만 이루어져 있습니다.

제출한 코드 :

def solution(s):
    char_index = {}
    result = []

    for i, char in enumerate(s):
        if char in char_index:
            result.append(i - char_index[char])
        else:
            result.append(-1)
        char_index[char] = i

    return result

0개의 댓글