Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
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
Tags
more
Archives
Today
Total
관리 메뉴

ycseo-tistory 님의 블로그

99클럽 코테 스터디 파이썬 비기너 21일차 파일 정리 본문

🎯 99클럽 코테 스터디 (完)

99클럽 코테 스터디 파이썬 비기너 21일차 파일 정리

ycseo-tistory 2025. 2. 18. 02:03

🤔 문제

더보기

문제
친구로부터 노트북을 중고로 산 스브러스는 노트북을 켜자마자 경악할 수밖에 없었다. 바탕화면에 온갖 파일들이 정리도 안 된 채 가득했기 때문이다. 그리고 화면의 구석에서 친구의 메시지를 확인할 수 있었다.

바탕화면의 파일들에는 값진 보물에 대한 정보가 들어 있어. 하나라도 지우게 된다면 보물은 물론이고 다시는 노트북을 쓸 수 없게 될 거야. 파일들을 잘 분석해서 보물의 주인공이 될 수 있길 바랄게. 힌트는 “확장자”야.

화가 났던 스브러스는 보물 이야기에 금세 화가 풀렸고 보물의 정보를 알아내려고 애썼다. 하지만 파일이 너무 많은 탓에 이내 포기했고 보물의 절반을 보상으로 파일의 정리를 요청해왔다. 스브러스의 요청은 다음과 같다.

 

파일을 확장자 별로 정리해서 몇 개씩 있는지 알려줘
보기 편하게 확장자들을 사전 순으로 정렬해 줘
그럼 보물의 절반을 얻어내기 위해 얼른 스브러스의 노트북 파일 정리를 해줄 프로그램을 만들자!


입력
첫째 줄에 바탕화면에 있는 파일의 개수 $N$이 주어진다. ($1 \leq N \leq 50\ 000$)

둘째 줄부터 $N$개 줄에 바탕화면에 있는 파일의 이름이 주어진다. 파일의 이름은 알파벳 소문자와 점(.)으로만 구성되어 있다. 점은 정확히 한 번 등장하며, 파일 이름의 첫 글자 또는 마지막 글자로 오지 않는다. 각 파일의 이름의 길이는 최소 $3$, 최대 $100$이다.

출력
확장자의 이름과 그 확장자 파일의 개수를 한 줄에 하나씩 출력한다. 확장자가 여러 개 있는 경우 확장자 이름의 사전순으로 출력한다.

예제 입력 1

8
sbrus.txt
spc.spc
acm.icpc
korea.icpc
sample.txt
hello.world
sogang.spc
example.txt

 

예제 출력 1

icpc 2
spc 2
txt 3
world 1

 

노트
엄청난 보물의 정체는 바탕화면을 정리했다는 뿌듯함이라고 알려진다.

출처
University > 서강대학교 > Sogang Programming Contest > 2020 Sogang Programming Contest > Champion A번
University > 서강대학교 > Sogang Programming Contest > 2020 Sogang Programming Contest > Open A번

알고리즘 분류
자료 구조, 문자열, 정렬, 해시를 사용한 집합과 맵, 트리를 사용한 집합과 맵, 파싱

From Baekjoon, https://www.acmicpc.net/problem/20291

✨ 답안

import sys

# 0. Init
extensions = {}

# 1. Get data
cnt = int(sys.stdin.readline().strip())
files = [sys.stdin.readline().strip() for _ in range(cnt)]

# 2. Separate extenders from file names
for file in files:
    _, extension = file.split('.')
    # 3. Check whether the extension name already noted and increase the count or append new
    if extension in extensions:
        extensions[extension] += 1
    else:
        extensions[extension] = 1

# 4. Sort the dictionary by keys
sorted_extensions = dict(sorted(extensions.items()))

# 5. Print the result
sys.stdout.write('\n'.join(f"{key} {value}" for key, value in sorted_extensions.items()))
더보기

✨ 원리

  1. 확장자의 이름과 확장자의 수를 각각 키와 값으로 가지는 원소들의 딕셔너리를 생성한다.
  2. 입력을 받는다.
  3. 2와 3의 과정을 입력의 개수(N)만큼 반복한다. 입력받은 파일의 이름을 온점을 기준으로 쪼개 뒤의 확장자만 사용한다.
  4. 확장자가 딕셔너리의 키로 존재한다면 카운트를 증가시키고, 아니라면 값을 1로 가지는 키를 추가한다.
  5. 키를 기준으로 딕셔너리를 정렬한다.
  6. 결과를 출력한다.

💻 구현

  • 딕셔너리를 정렬하는 방법을 잘 익히자. ' sorted_extensions = dict(sorted(extensions.items())) '를 살펴보자. 딕셔너리를 키 기준으로 정렬하기 위해서는 .items() 함수로 우선 키-밸류 쌍을 가지는 튜플을 담는 리스트를 만든다. 그리고 sort() 함수로 그것을 정렬한다. 그리고 다시 딕셔너리로 만든다. 이때, 딕셔너리에 직접 sort() 함수를 쓰면 키만 정렬된 리스트가 나오기 때문에 (["icpc", "spc", "txt", "world"])이런 방법을 사용해야 한다.
  • 출력할 문자열로 만드는 방법도 잘 알아두자. 'sys.stdout.write('\n'.join(f"{key} {value}" for key, value in sorted_extensions.items()))'를 기억해 두면 편할 것이다.

😂 후기

매일 코딩 테스트 하는 인간으로 한 달 살기 체험이 곧 끝난다. 슬슬 할 일 목록에 안 써도 홈페이지를 들어가고 있다. 습관이 슬슬 잡히는 듯. 코드 짜는 나름의 요령과 경험도 생긴 게 느껴지고. 다음 달에는 좀 더 어려운 문제로 매일 하나씩 해야지.