Python_알고리즘/Silver IV
1755. [Python]숫자놀이
최근영
2023. 4. 11. 02:12
1. 문제
2. 접근 방법
- 시간 제한: 2초
- 메모리 제한: 128MB
- 정렬
- 딕셔너리
3. 파이썬 코드
N,M = map(int,input().split())
ans_list = []
num_list = []
for i in range(N,M+1):
num_list.append(str(i))
# 들어온 숫자를 문자로 변경할 딕셔너리
num_dict = {
"1" : "one",
"2" : "two",
"3" : "three",
"4" : "four",
"5" : "five",
"6" : "six",
"7" : "seven",
"8" : "eight",
"9" : "nine",
"0" : "zero"
}
# 문자를 다시 숫자로 변환
return_dict = {
"one" : "1",
"two" : "2",
"three" : "3",
"four" : "4",
"five" : "5",
"six" : "6",
"seven" : "7",
"eight" : "8",
"nine" : "9",
"zero" : "0"
}
# 들어온 값의 숫자를 리스트 형태로 문자로 변형하여 저장
for i in num_list:
check_list = []
for j in i:
check_list.append(num_dict[j])
ans_list.append(check_list)
# 문자열로 정렬
ans_list.sort(key=lambda x:x[:])
# 10개 단위로 줄이바뀌므로 체크하는 변수
cnt = 1
# 정렬된 문자열을 다시 숫자로 변환하는 과정
for i in ans_list:
answer = ""
for j in i:
answer += return_dict[j]
if cnt == 10:
print(answer)
cnt = 1
else:
print(answer, end=" ")
cnt += 1
4. 문제를 풀고난 후 생각
- input 으로 범위가 들어오면 우선 그 범위내의 모든 숫자를 생성한다.
- 딕셔너리를 사용한 이유는 시간 복잡도를 감소시키기 위해서 딕셔너리로 값을 미리 생성해둔다.
- 반복문을 통해서 리스트를 순회하며 숫자를 한개한개 분리하여 문자로 변환해서 새로운 리스트에 저장한다.
=> 18 이 들어오면 1, 8 로 나누어 ["one", eight"] 형태로 리스트 저장하는 방식이다.
=> [["eight"], ["nine"], ["one", "zero"]] 이런 형태로 저장된다. - lambda 정렬을 통해서 리스트 내부를 문자열 내림차순으로 정렬한다.
- 위의 과정을 진행하면 리스트가 정렬된 형태로 존재하며 다시 숫자로 변환해주는 방법으로 딕셔너리에 값을 넣어서 반환해주는 방식을 선택했다.
- 10개 단위로 줄이 바뀌므로 cnt 라는 변수를 생성하여 이를 조절해줬다.
- 정렬을 어떻게 하는지 정도만 알면 나머지 방식은 쉽게 생각할 수 있던 문제였다.
5. 문제를 푸는데 도움이 되는 지식
- lambda를 이용한 정렬
- 딕셔너리