
출처
친구로부터 노트북을 중고로 산 스브러스는 노트북을 켜자마자 경악할 수밖에 없었다. 바탕화면에 온갖 파일들이 정리도 안 된 채 가득했기 때문이다. 그리고 화면의 구석에서 친구의 메시지를 확인할 수 있었다.
바탕화면의 파일들에는 값진 보물에 대한 정보가 들어 있어. 하나라도 지우게 된다면 보물은 물론이고 다시는 노트북을 쓸 수 없게 될 거야. 파일들을 잘 분석해서 보물의 주인공이 될 수 있길 바랄게. 힌트는 “확장자”야.
화가 났던 스브러스는 보물 이야기에 금세 화가 풀렸고 보물의 정보를 알아내려고 애썼다. 하지만 파일이 너무 많은 탓에 이내 포기했고 보물의 절반을 보상으로 파일의 정리를 요청해왔다. 스브러스의 요청은 다음과 같다.
- 파일을 확장자 별로 정리해서 몇 개씩 있는지 알려줘
- 보기 편하게 확장자들을 사전 순으로 정렬해 줘
입력 8 sbrus.txt spc.spc acm.icpc korea.icpc sample.txt hello.world sogang.spc example.txt출력 icpc 2 spc 2 txt 3 world 1
입출력만 봐도 무엇이 중요한지 보인다.
문제는 어렵지 않다.
다만 어떻게 해야 코드를 깔끔하고 이쁘게 파이써닉하게 작성할지를 고민해보자.
n = int(input()) # 파일의 수
extension_count = {} # 각 파일에서 확장자가 뭔지 구하고 각 확장자의 개수를 구해야함.
for i in range(n):
extension = input().split(".")[-1] # 파일은 파일명과 확장자로 구성되어 있으며 구분하는 것은 "."에 의해서임.
extension_count[extension] = extension_count.get(extension,0) + 1 # extension에 해당하는 값이 있다면 해당 값을 가져온 후 +1 없다면 0을 반환하여 +1
for extension in sorted(extension_count):
print(extension, extension_count[extension])
사실 아래가 내 첫 코드이다.
# 파일을 확장자 별로 정리해서 몇 개씩 있는지 알려줘
# 보기 편하게 확장자들을 사전 순으로 정렬해 줘
dict = {}
# 파일이 뭔지는 무시해도 됨.
# 그저 확장자만이 중요함.
# 즉, .이후의 단어에 대해
n = int(input())
for i in range(n):
file = input()
idx = file.find('.')
extension= file[idx+1:]
if extension not in dict:
dict[extension] = 1
else:
dict[extension] += 1
extensions = sorted(dict)
for extension in extensions:
print(extension, dict[extension])
불필요한 지점이 많이 발생되었다.
1. split을 사용하지 않고 find를 사용한 점. 이때문에 슬라이싱을 한 점.
2. 새로 sorted(dict)를 통해 리스트를 생성한 점.
extension_count.get(file, 0):
get은 딕셔너리에서 키에 해당하는 값을 찾는 함수이다.
이 경우, file은 현재 처리 중인 파일의 확장자를 나타내며,
이 확장자를 키로 사용하여 extension_count 딕셔너리에서 값을 검색한다.
get 함수의 두 번째 인자 0은 키가 딕셔너리에 존재하지 않을 경우 반환될 기본값이다.
즉, 만약 file 확장자가 딕셔너리에 아직 없다면, 0을 반환한다.
split('.')[-1]
split 함수는 문자열을 특정 구분자를 기준으로 나누어 리스트를 생성하는 함수이다. 이 경우, split('.')는 문자열(여기서는 파일 이름)을 '.'을 기준으로 나눈다.
get을 사용하는 것을 까먹었고, split이 리스트로 반환된다는 사실을 까먹었다.ㅠㅠ