morijwana
수로그
morijwana
전체 방문자
오늘
어제
  • 분류 전체보기
    • 강의노트
    • Machine Learning
      • Pandas
      • NLP
    • Computer Science
      • Linux
      • TIL
    • Development
      • React
      • Swift
      • Javascript
    • 스터디 기록
      • Clean Code
      • 구글 BERT의 정석
      • 개발도서
      • 기타
    • Problem Solving
      • Baekjoon
      • ICPC Sinchon
    • 끄적
      • 끄적끄적
      • 요리왕

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 구부정스터디
  • Pandas
  • nlp
  • Bert
  • GDSC Sookmyung
  • cs224n
  • 회고
  • word2vec
  • 데이터사이언스
  • 프로그래밍언어론
  • ML
  • Solution Challenge
  • Python
  • 백준
  • gdsc
  • 구글BERT의정석
  • 자연어처리
  • 프레임워크없는프론트엔드개발
  • 개발도서
  • 민트하임스터디

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morijwana

수로그

Problem Solving/Baekjoon

백준 1431번 - 시리얼 번호(Python)

2020. 2. 18. 22:14

https://www.acmicpc.net/problem/1431

 

 

문제

 

다솜이는 기타를 많이 가지고 있다. 그리고 각각의 기타는 모두 다른 시리얼 번호를 가지고 있다. 다솜이는 기타를 빨리 찾아서 빨리 사람들에게 연주해주기 위해서 기타를 시리얼 번호 순서대로 정렬하고자 한다.

모든 시리얼 번호는 알파벳 대문자 (A-Z)와 숫자 (0-9)로 이루어져 있다.

시리얼번호 A가 시리얼번호 B의 앞에 오는 경우는 다음과 같다.

  1. A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
  2. 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)
  3. 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.

시리얼이 주어졌을 때, 정렬해서 출력하는 프로그램을 작성하시오.

 

 

입력

 

첫째 줄에 기타의 개수 N이 주어진다. N은 1,000보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어져 있다. 시리얼 번호는 중복되지 않는다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import functools
 
def intsum(string):
    sum = 0
    for i in string:
        if 48 <= ord(i) <= 57:
            sum += int(i)
    return sum
 
 
def compare(str1, str2):
    if len(str1) > len(str2):  # 첫번째 조건
        return 1
    elif len(str1) < len(str2):
        return -1
 
    strint1 = intsum(str1)
    strint2 = intsum(str2)
 
    if strint1 > strint2:  # 두번째 조건
        return 1
    elif strint1 < strint2:
        return -1
 
    if str1 > str2: # 세번째 조건
        return 1
    else:
        return -1
 
 
n = int(input())
strList = []
 
for i in range(n):
    str = input()
    strList.append(str)
 
ansList = sorted(strList, key=functools.cmp_to_key(compare))
 
for item in ansList:
    print(item)
Colored by Color Scripter
cs

 

intsum(string)

 

문자열 속 숫자를 모두 더해서 리턴해주는 함수.

문자와 숫자를 구별할 별다른 방법이 생각나지 않아서 C에서 하던 것처럼 아스키 코드로 판별했음

 

 

compare(str1, str2)

 

문제의 정렬 조건에 따라 str1과 str2를 비교하는 함수

1)시리얼의 길이 - 2)시리얼 번호 속 숫자의 합 - 3)사전순으로 비교하고, str1 > str2면 1, 반대의 경우 -1를 리턴함

sorted()의 key 파라미터에 집어넣을 용도로 만든 함수임

 

 

Key skills

 

sorted() 함수의 key로 정렬 조건을 담고 있는 비교 함수를 전달하면 알아서 정렬해줌.

첫번째 인자가 두번째 인자보다 우선순위가 높으면 양수를 리턴하고, 반대의 경우 음수를 리턴하도록 짜면 됨(아래 코드의 compare() 참고).

둘의 우선순위가 같은 경우는 양수를 리턴하든 음수를 리턴하든 상관 없음

다만, key=compare처럼 비교함수를 날것의 상태로 바로 집어넣으면 파이참이 생난리를 피움

key=functools.cmp_to_key(compare)처럼 표준 라이브러리의 functools 모듈에 포함된 cmp_to_key() 함수를 한 번 거쳐서 집어넣어줘야 함

'Problem Solving > Baekjoon' 카테고리의 다른 글

백준 14500번 - 테트로미노(C++)  (1) 2021.09.24
백준 2812번 - 크게 만들기(Swift)  (4) 2021.05.07
백준 9519번 - 졸려(Python)  (0) 2020.08.12
백준 2675번 - 문자열 반복(Python)  (0) 2020.02.27
    'Problem Solving/Baekjoon' 카테고리의 다른 글
    • 백준 14500번 - 테트로미노(C++)
    • 백준 2812번 - 크게 만들기(Swift)
    • 백준 9519번 - 졸려(Python)
    • 백준 2675번 - 문자열 반복(Python)
    morijwana
    morijwana
    행복한 휴학생의 devlog

    티스토리툴바