📚 오늘 공부한 내용
- 실제 코딩 테스트 문제를 바탕으로 자료 구조와 알고리즘을 적용
1. 완주하지 못한 선수 - 해쉬(Hash)
✔ 나의 풀이
2. 체육복 - 탐욕법(Greedy)
✔ 나의 풀이
3. 가장 큰 수 - 정렬 (Sort)
✔ 나의 풀이
4. 큰 수 만들기 - 탐욕법 (Greedy)
✔ 나의 풀이
🔎 어려웠던 내용 & 새로 알게 된 내용
1. 완주하지 못한 선수 - 해쉬(Hash) 사용 문제
collections.Counter(list)
: list의 각 원소를 key
로 가지고 그 원소의 count() 값을 value
로 가지는 Dictionary
를 생성해 준다. (Counter의 사용을 위해서는 import collections
필수로 해 주어야 함.)
Dictionary
끼리 연산이 가능하다는 사실을 처음 알게 되었다. -> 두 Dictionary의 합이나 차
를 알아야 하는 Counter
를 사용해야 하는 문제의 경우 유용하게 쓰일 것 같다.
2. 체육복 - 탐욕법(greedy) 사용 문제
set
은 교집합, 합집합, 차집합이 필요한 자료형을 구할 때 매우 유용하며 set(list)
를 할 경우 list 원소의 중복 제거
가 일어난다.
- 다만
set
자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다.
- 교집합은
&
, 합집합은 |
, 차집합은 -
로 구할 수 있다.
3. 정렬 - 가장 큰 수
- 정렬을
Dictionary
나 List
의 경우 특정 조건으로 해 주고 싶을 때는 lambda 식
을 이용해야 한다.
- 해당 문제의 경우
int
로 구성된 list
의 원소들을 문자열로 바꿔 주어 사전 순
으로 정렬해야 했기 때문에,
numbers.sort(reverse=True, key = lambda x : str(x)*3)
다음과 같은 lambda 식
을 이용해 주었다.
- 문제를 풀 때는
제한 사항
을 하나씩 읽으며 예외의 가능성을 생각해야 한다.
- 이 문제는 numbers의 원소가 0이 될 수 있다는 점을 이용하여 예외가 발생했는데
[0, 0, 0, 0]
인 경우 문자열이어도 전체가 0
이므로 0
이 되어야 하는데 문자열로 바꾸는 과정에서 0000
이 되는 케이스가 발생했고 이 부분에 대한 예외 처리를 해 주어야 한다는 것을 발견하는 데 시간이 걸렸다.
✍ 회고
코딩 테스트 문제를 풀면서 어떠한 자료구조와 알고리즘을 응용하는가 그리고 그에 따른 알고리즘 복잡도까지 따져 봤을 때 무엇이 더 효율적인가를 파악하는 것은 1차적으로 가장 중요한 것이라고 생각한다. 두 번째로 중요한 것은 제한 사항이나 기본적으로 제시된 파라미터의 환경을 꼼꼼하게 파악하여 예외가 되는 케이스들을 문제만 보고도 파악할 수 있어야 한다는 점인 것 같다. 문제를 풀며 정확성 테스트에서 특정 케이스만 막히는 경우가 빈번했는데 문제를 풀면서 그러한 예외들은 모두 제한 사항이나 주어진 환경에서 파악할 수 있다는 것을 느꼈다. 아직은 부족하고 꾸준히 공부해 나가야 할 부분이다.