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
구글링을 통해 람다의 활용법을 찾아볼 수 있었다.
[프로그래머스/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-번째 글자가 같은 문자열들끼리는 원래의 순서를 유지하도록 하기 위한 것이다. 즉, 사전순으로 앞서는 문자열을 먼저 배치하도록 한다.
람다 함수에 대해서 잘 정리해두셔서 해당 링크도 첨부한다.
[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번 문제, 람다의 활용법을 숙지해야해서 시간이 오래 걸릴 예정이다.
'알고리즘(파이썬)' 카테고리의 다른 글
43번-45번 (0) | 2024.08.08 |
---|---|
프로그래머스 '이상한 문자열 만들기' 문제와 필요한 개념 (0) | 2024.08.07 |