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를 이용한 정렬
  • 딕셔너리