알고리즘(파이썬)

알고리즘 46-48

whateveryouwish 2024. 8. 13. 20:45

46번

숫자 문자열과 영단어

 

문제

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

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

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

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

 

def solution(s):
    num = {
        'zero' : '0',
        'one' : '1',
        'two' : '2',
        'three': '3',
        'four' : '4',
        'five' : '5',
        'six' : '6',
        'seven' : '7',
        'eight' : '8',
        'nine' : '9'}
    for k, v in num.items():
        s = s.replace(k, v)
    answer = int(s)
    return answer

 

숫자와 영어 숫자가 주어졌으니 (0~9) 해당 단어들로 딕셔너리를 만들어두고

해당 영단어(문자열)이 나오면 딕셔너리 상의 숫자로 변환시키는 함수이다.

 

for 문을 거치고 나면 s는 문자열로 나오기 때문에 해당 문자열을 정수로 바꿔주는 작업이 필요하다.

 


 

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 = []
    
    answer = sorted(strings, key = lambda x : (x[n], x))
    return answer

 

구글링을 통해 람다의 활용법을 찾아볼 수 있었다.

 

https://velog.io/@k_bobin/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4Python-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0

 

[프로그래머스/Python] 문자열 내 마음대로 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/12915for문을 통해 딕셔너리를 생성한다. 키는 원래 주어진 단어 값은 n인덱스부터 자른값을 넣는다.딕셔너리의 값을 기준으로 딕셔너리를 정렬한다.딕

velog.io

 

*참고*

  • lambda x: (x[n], x) : 람다 함수를 사용하여 두 가지 값을 반환한다. 람다 함수에서 x는 리스트 strings의 각 원소를 의미한다.
  • 첫 번째 반환 값인 x[n]은 각 문자열에서 인덱스 n에 해당하는 문자를 의미한다. 이렇게 설정함으로써, sorted 함수는 각 문자열의 n-번째 글자를 기준으로 정렬하게 된다.
  • 두 번째 반환 값인 x는 정렬 기준으로 첫 번째 값인 x[n]이 동일한 경우, 즉 n-번째 글자가 같은 문자열들끼리는 원래의 순서를 유지하도록 하기 위한 것이다. 즉, 사전순으로 앞서는 문자열을 먼저 배치하도록 한다.

 

람다 함수에 대해서 잘 정리해두셔서 해당 링크도 첨부한다.

 

https://velog.io/@k_bobin/Python-%EB%9E%8C%EB%8B%A4lambda%ED%95%A8%EC%88%98-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0

 

[Python] 람다(lambda)함수 마스터하기

람다(lambda)는 코딩 테스트 및 프로그래밍에서 많이 사용되는 개념 중 하나입니다. 람다는 간단하면서도 강력한 함수를 생성할 수 있는 기능으로, 주로 함수형 프로그래밍 패러다임을 지원하는

velog.io

 


 

48번

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입니다.
입출력 예

array			commands				return
[1, 5, 2, 6, 3, 7, 4]	[[2, 5, 3], [4, 4, 1], [1, 7, 3]]	[5, 6, 3]

 

예시가 중요한 문제라서 입출력 예시도 가져왔다.

 

def solution(array, commands):
    answer = []
    for i in range(len(commands)):
        sliced_array = array[commands[i][0]-1:commands[i][1]]
        sliced_array = sorted(sliced_array)
        answer.append(sliced_array[commands[i][2]-1])
    return answer

 

2차원 배열의 commands를 순회하면서 리스트 인덱싱 및 슬라이싱을 헷갈리지 않고 하는 것이 이 문제의 포인트이다.

2차원 배열은 보통 for문 중첩을 주로 활용하지만 이 문제는 특별하게 commands의 각 원소가 길이가 3이고

각 원소가 결국 commands[i]의 슬라이싱을 '한 번에' 해야하기 때문에

for j in range(len(commands[i])): 를 쓸 필요가 없는 것이다.

 

오늘 알고리즘 문제들은 그렇게 어렵지 않았지만 47번 문제, 람다의 활용법을 숙지해야해서 시간이 오래 걸릴 예정이다.