관리 메뉴

솜씨좋은장씨

[JUNGOL] 1516번 : 단어 세기 (Python) 본문

Programming/코딩 1일 1문제

[JUNGOL] 1516번 : 단어 세기 (Python)

솜씨좋은장씨 2021. 5. 17. 00:08
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 정올의 단어 세기 입니다.

 

JUNGOL

 

www.jungol.co.kr

Solution

from collections import Counter

while True:
    input_str = input()
    if input_str == "END":
        break
    
    words = input_str.split(" ")
    
    word_cnt_items = sorted(Counter(words).items(), key=lambda x: x[0])

    for item in word_cnt_items:
        print(f"{item[0]} : {item[1]}")

Solution 풀이

collections의 Counter를 활용하여 풀어보았습니다.

while 반복문 안에서 문자열을 입력 받습니다.

반복문은 입력받은 문자열이 "END" 일 경우에 종료합니다.

입력받은 문자열을 공백으로 split하여 words 리스트로 만들어주고 

이를 collections의 Counter를 통하여 각 단어의 개수를 하나씩 세어줍니다.

그 다음 .items()를 통해 (단어, 카운팅한 횟수) 형식의 데이터를 저장한 리스트로 만들어준 다음

단어 순서를 기준으로 sorting한 뒤에!

단어 : 횟수 이렇게 출력해주도록 하면 끝!

 

이렇게 풀고 나니 collections를 사용하지 않고 직접 카운팅을 하도록 하면?

두 방법의 속도차이는 얼마나 날까? 라는 생각이 들었습니다.

 

Solution 2

while True:
    input_str = input()
    count_dict = dict()
    
    if input_str == "END":
        break
    
    words = input_str.split(" ")
    
    for word in words:
        if word not in count_dict.keys():
            count_dict[word] = 0

        count_dict[word] += 1
        
    count_items = sorted(count_dict.items(), key=lambda x: x[0])
        
    for item in count_items:
        print(f"{item[0]} : {item[1]}")

똑같이 "END"가 입력될 때 까지 while 반복문을 돌면서 문자열을 입력 받고

입력받은 문자열을 공백으로 split하여 words 리스트로 만들어줍니다.

그다음 words리스트에서 단어를 하나씩 꺼내고 

카운팅한 정보를 담아둘 count_dict라는 dictionary에 존재하는지 존재하지 않는지 확인합니다.

만약에 존재하지 않는다면 해당 단어를 키로 등록하고 0을 넣어줍니다.

그리고 하나 카운팅을 합니다.

그 뒤에는 아까와 동일하게 단어를 기준으로 sorting 하고 출력하면 끝!

제출하고 두 방식의 속도 차이를 비교해 보았는데 3ms 정도의 차이밖에 나지 않았습니다.

 

이것 보다 더 효율적인 방법으로 풀 수 있는 방법이 있다면!

언제든 댓글 부탁드립니다~

 

SOMJANG/CODINGTEST_PRACTICE

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments