문제풀이/일일연습문제

[Sort]99클럽 코테 스터디 31일차 TIL + 백준/Silver/1755. 숫자놀이

Mo_bi!e 2024. 11. 28. 10:48

숫자놀이

문제

79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 80은 마찬가지로 "eight zero"라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero""seven nine"보다 사전순으로 먼저 온다.

문제는 정수 M, N(1 ≤ MN ≤ 99)이 주어지면 M 이상 N 이하의 정수를 숫자 하나씩 읽었을 때를 기준으로 사전순으로 정렬하여 출력하는 것이다.

입력

첫째 줄에 MN이 주어진다.

출력

M 이상 N 이하의 정수를 문제 조건에 맞게 정렬하여 한 줄에 10개씩 출력한다.

예제 입력 1

8 28

예제 출력 1

8 9 18 15 14 19 11 17 16 13
12 10 28 25 24 21 27 26 23 22
20

 

 

<내 코드 >

import sys
# 1. 값 두개 입력받음 (정수)
M, N = sys.stdin.readline().strip().split()

# 1-1 입력 받은 값 (정수로 나열)
numbers = [str(i) for i in range(int(M), int(N) + 1)]

# 2. 정렬 기준 만듬
number_standard = {0 : 'zero', 1: 'one', 2: 'two', 3: 'three', 4:'four', 5:'five', 6:'six', 7:'seven', 8:'eight', 9:'nine'}
number_standard_sort = dict(sorted(number_standard.items(), key=lambda x: x[1]))

# 원래 숫자와 우선순위 정렬
number_dict = {str(n) : i for i, n in enumerate(number_standard_sort)}

# 2. 값들 정렬
# for _ in range(len(numbers)):
# # 1순위 : 자리 갯수 (한자리, 두자리)
#     if len(numbers[i]) == 1:

# numbers.sort(key = lambda x : (len(x), number_dict[x]))
numbers.sort(key=lambda x: [number_dict[digit] for digit in x])
i = 1
for num in numbers:
    sys.stdout.write(str(num) + " ")
    if i % 10 == 0:
        sys.stdout.write("\n")
    i += 1

# 비람다 방식
# def sort_key(x):
#     # 각 자릿수를 number_dict의 순서로 매핑
#     mapped_digits = [number_dict[digit] for digit in x]
#     return mapped_digits
# # 두 자릿수 이상의 숫자도 처리
# numbers.sort(key=sort_key)

- 정렬기준을 만들고, 해당 부분을 기준으로 숫자별 우선순위 기준 잘만든게 뿌듯함

여기에 더불어 number_dict 에 대한 람다로 정렬하는 방법에 대해서도 익히게 

 

- 하지만

1. number_standard_sort 는 불 필요함

2. 정렬기준 좀 더 단순하게 가능

 

- enumerate() 를 좀 더 활발하게 사용하기

마지막 출력 부분에 불필요하게 사용하고 있음

 

- 사고 방식

입력 리스트 만들고 -> 0 ~ 9 에 대한 매핑 딕셔너리 만들기 -> 매핑 딕셔너리를 기준으로 입력받은 값 정렬하기

 

 

<모범사례>

import sys

# 숫자와 영단어 매핑 딕셔너리
number_dict = {
    '0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four',
    '5': 'five', '6': 'six', '7': 'seven', '8': 'eight', '9': 'nine'
}

# 입력 받기
M, N = map(int, sys.stdin.readline().split())

# 숫자 리스트 생성
numbers = [str(i) for i in range(M, N + 1)]

# 정렬
numbers.sort(key=lambda x: ' '.join(number_dict[digit] for digit in x))

# 출력
for i, num in enumerate(numbers, 1):
    print(num, end=' ')
    if i % 10 == 0:
        print()

단순한 방법으로 접근함

 

 

<보충 학습>

numbers.sort(key=lambda x: ' '.join(number_standard[digit] for digit in x))

모범사례의 sort를 고찰해보기

 

1. 숫자 x 에 대해서 딕셔너리의 값에서 알파벳으로 매핑 함

2. 매핑한 각 값에 대해서 join 으로 ' ' 공백을 만들어서 붙여 줌

3. join 된 각 문자열 들을 기준으로 정렬하기

이 경우 정렬은 아스키코드로 함