숫자놀이
문제
79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"
이 된다. 80은 마찬가지로 "eight zero"
라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"
가 "seven nine"
보다 사전순으로 먼저 온다.
문제는 정수 M
, N
(1 ≤ M
≤ N
≤ 99)이 주어지면 M
이상 N
이하의 정수를 숫자 하나씩 읽었을 때를 기준으로 사전순으로 정렬하여 출력하는 것이다.
입력
첫째 줄에 M
과 N
이 주어진다.
출력
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 된 각 문자열 들을 기준으로 정렬하기
이 경우 정렬은 아스키코드로 함
'문제풀이 > 일일연습문제' 카테고리의 다른 글
*재풀이 필요[simulation]99클럽 코테 스터디 34일차 TIL + 백준/133502/햄버거 만들기 (0) | 2024.12.01 |
---|---|
*재풀이 필요[simulation]99클럽 코테 스터디 33일차 TIL + 백준/Bronze/13419. 탕수육 (0) | 2024.11.30 |
[Sort]99클럽 코테 스터디 30일차 TIL + 백준/Bronze/1524. 세준세비 (1) | 2024.11.27 |
[Sort]99클럽 코테 스터디 29일차 TIL + 2327-largest-number-after-digit-swaps-by-parity (0) | 2024.11.26 |
[Sort]99클럽 코테 스터디 28일차 TIL + python_Algorithm/0506-relative-ranks (0) | 2024.11.25 |