[Tistory] 알고리즘 46-48

원글 페이지 : 바로가기

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번 문제, 람다의 활용법을 숙지해야해서 시간이 오래 걸릴 예정이다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다