[백준] #1755 숫자놀이(python)

수영·2022년 12월 4일

백준

목록 보기
91/117
post-thumbnail

📌문제

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개씩 출력한다.

예제 입력

8 28

예제 출력

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

백준 1755번 문제

💡Idea

숫자를 영어로 변환했을 때, 사전순으로 정렬하는 문제입니다.

문제를 보면 입력받은 범위 내의 숫자들을 모두 영어로 변환한 뒤 정렬을 해서 푸는 방법이 가장 먼저 생각납니다.
하지만, 숫자를 영어로 변환하여 정렬했을 때의 순서를 미리 정의해둔다면 굳이 숫자를 영어로 변환하는 과정을 거칠 필요가 없습니다.

문제에서 숫자들은 한 자리수 혹은 두 자리수 이기 때문에, 두 가지 경우를 잘 처리하는 것이 중요합니다.

  • 숫자가 두 자리 수 인 경우 : 10의 자릿수로 정렬 후, 10의 자릿수가 동일하다면 1의 자릿수로 정렬을 한다.
  • 숫자가 한 자리 수 인 경우 : 1의 자릿수로 정렬을 한 뒤, 두 자리 수 숫자의 10의 자릿수와 동일한 경우 무조건 우선순위를 갖는다.
    EX) 7인 seven과 72인 seven two의 경우, 동일하게 seven이 포함되지만 7인 seven이 우선순위를 갖는다.

💻코드

  • ⏰ 시간 : 72 ms / 메모리 : 30840 KB
import sys
input = sys.stdin.readline

M, N = map(int, input().split())
arr = [10, 5, 9, 8, 3, 2, 7, 6, 1, 4] # 0부터 9까지 사전순으로 정렬했을 때의 순서
nums = [i for i in range(M, N+1)] # 정렬해야 하는 숫자 리스트
nums.sort(key=lambda num: [arr[num // 10 if num > 9 else num % 10],
                           arr[num % 10] if num > 9 else 0])
for i in range((len(nums) // 10)):
    print(*nums[i * 10:(i + 1) * 10])
if (len(nums) % 10):
    print(*nums[-(len(nums) % 10):])

📝코드 설명

숫자 리스트를 정렬할 때 아래와 같은 조건으로 정렬을 해줍니다.

  • 첫번째 조건 : 숫자가 9보다 큰 경우에는 10의 자릿수로, 9 이하인 경우에는 1의 자릿수를 기준으로 정렬한다.
  • 두번째 조건 : 숫자가 9보다 큰 경우에는 1의 자릿수로, 9 이하인 경우에는 무조건 0으로, 가장 우선순위를 가질 수 있도록 한다.

그리고, 정렬된 숫자들은 10개씩 끊어서 출력할 수 있도록 합니다.
저는 nums를 10개씩 출력한 뒤, 뒤에 남아있는 것들은 따로 한 번 더 출력해줄 수 있도록 했습니다.

profile
하고 싶은 건 그냥 죽도록 합니다

0개의 댓글