본문 바로가기

개발일지/TIL

TIL 23-05-05 코딩테스트 입문 완료

https://github.com/sdoram/Algorithm

https://github.com/sdoram/algorithm_solving_process

 

GitHub - sdoram/algorithm_solving_process: 알고리즘 풀이 과정 python 파일

알고리즘 풀이 과정 python 파일. Contribute to sdoram/algorithm_solving_process development by creating an account on GitHub.

github.com

 

1. 백준 알고리즘 - 단어정렬

 문제점

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 시도해 본 것들

예시 dict 만들기 & 람다 사용하기

word_dict = {
    'but': 3,
    'i': 1,
    'wont': 4,
    'hesitate': 8,
    'no': 2,
    'more': 4,
    'no': 2,
    'more': 4,
    'it': 2,
    'cannot': 6,
    'wait': 4,
    'im': 2,
    'yours': 5,
}
sorted_word_dict = sorted(word_dict.items(), key=lambda value: value[1])
print(sorted_word_dict)

lambda 식을 통해서 value를 기준으로 sorted 하기 

 

예시 dict 바꿔보기 

word_dict = {
    3: ['but'],
    1: ['i'],
    8: ['hesitate'],
    2: ['no', 'it', 'im', 'no'],
    4: ['more', 'wait', 'more', 'wont'],
    6: ['cannot'],
    5: ['yours'],
}

key = len(word), value = word로 가지는 dict로 변경 

 

2중 for문으로 value에 접근하기

for word_len in sorted(word_dict):
    for word in word_dict[word_len]:
        print(word)

이 코드를 통해서 모든 value를 순회

 

사전순 정렬 & 중복 단어 제거

for num in sorted(word_dict):
    for word in sorted(set(word_dict[num])):
        print(word)

set()으로 중복 단어 제거 후 sorted로 정렬

 

입력으로 dict 만들기 

word_dict = {}
# 테스트 케이스만큼 입력 받기
for _ in range(int(input())):
    word = input()
    # key가 문자열의 길이 value가 단어로 딕셔너리 넣기
    if len(word) not in word_dict:
        word_dict[len(word)] = [word]
    else:
        word_dict[len(word)] += [word]

자주 애용하는 딕셔너리 활용으로 key가 없으면 만들고, 존재하면 value를 추가하는 방식으로 구현

 

TIL 작성 중 word를 key로 받은 경우 리팩토링

word_dict = {
    'but': 3,
    'i': 1,
    'wont': 4,
    'hesitate': 8,
    'no': 2,
    'more': 4,
    'it': 2,
    'cannot': 6,
    'wait': 4,
    'im': 2,
    'yours': 5
}

word_dict = {}
# 테스트 케이스만큼 입력 받기
for _ in range(int(input())):
    word = input()
    # key가 문자, value가 단어의 길이로 딕셔너리 넣기
    # 중복인 경우 겹치므로 중복 제거 필요 X
    word_dict[word] = [len(word)]
# word를 사전순으로 먼저 정렬
word_dict = sorted(word_dict.items())
# 길이를 기준으로 재정렬
word_dict = sorted(word_dict, key=lambda value: value[1])
for word in word_dict:
    print(word[0])

다시 정렬할 때 기준이 같으면 기존의 정렬된 순서와 같은 것을 이용한 풀이방법이다. 이 방법보다 첫 번째 방식이 시간과 메모리 모두 좋은 결과를 보이고 있어서 그리 좋은 코드는 아닌 듯싶지만, dict의 key를 받는 방식이 문제가 아니었던 것을 알 수 있다. 

 해결 방법

길이를 key로 사용

word_dict = {}
# 테스트 케이스만큼 입력 받기
for _ in range(int(input())):
    word = input()
    # key가 문자열의 길이, value가 단어로 딕셔너리 넣기
    if len(word) not in word_dict:
        word_dict[len(word)] = [word]
    else:
        word_dict[len(word)] += [word]
# key를 기준으로 정렬
for num in sorted(word_dict):
    # 밸류 set으로 중복 제거, sorted로 사전순 정렬
    for word in sorted(set(word_dict[num])):
        print(word)

 

단어를 key로 사용

word_dict = {}
# 테스트 케이스만큼 입력 받기
for _ in range(int(input())):
    word = input()
    # key가 문자, value가 단어의 길이로 딕셔너리 넣기
    # 중복인 경우 겹치므로 중복 제거 필요 X
    word_dict[word] = [len(word)]
# word를 사전순으로 먼저 정렬
word_dict = sorted(word_dict.items())
# 길이를 기준으로 재정렬
word_dict = sorted(word_dict, key=lambda value: value[1])
for word in word_dict:
    print(word[0])

 

 알게 된 점

예시가 주어지고 결과가 보이는 프로그래머스에서 사용하다가 제출 전 직접 만들어서 테스트해야하는 백준에서 내가 사용하고자 하는 형태의 딕셔너리를 만드는데 시간이 걸렸다. 

dict가 담을 수 있는 정보량이 많아서 그런지 같은 결과를 도출하는 다양한 방법이 존재하는 것 같다. 

 

코린이에게 주는 내 선물

분수의 덧셈에서 한 번 꺾였지만, 드디어 코딩 테스트에 입문했다.