코딩 스토리
시간이 오래걸린 요인으로는 문제를 보고 무턱대고 코딩을 시작했던 점이었다. 문제를 모두 이해하고 차근차근 로직을 세운 다음에 코딩을 하는 것이 오히려 빨랐다.
처음 접근은 신고자 - 신고대상 관계여서 단순하게 1대 다 관계라고 생각하고 딕셔너리(연관배열)로 접근을 시도했다. 코딩을 하던중 1명이 한사람을 선택하지만 다른사람도 선택할 수 있고 여러번 지목이 안된다는 점에서 이미 딕셔너리 구조를 사용하지 못한다. 딕셔너리 구조는 하나의 키 하나의 값만 가지므로 1대 1 구조로 보는것이 맞았다 이때까지 키와 값으로 구성되어서 1대 다 구조로 생각해왔는데 이것은 잘못 생각했었다.
그럼 딕셔너리는 잘못되었고 다른방법으로는 무엇이 있을까 고민하다 배열을 두개로 만들어서 for 를 돌때 두개의 배열을 같은 인덱스를 지목하도록 유도해서 해결했다. 이문제를 해결하기 위해서는 논리를 이렇게 구성했다.
1. 받은 배열의 중복을 제거하자 (집합으로 변경후 다시 배열로 변환)
- 이부분은 배열을 집합으로 변환했을때 set(배열) 의 특징중 중복이 제거된다는 점을 활용해서 중복을 제거했다
2. 문자열 띄워쓰기로 구분되어진 부분을 두개로 분리하자 (여기까지 사전 빌드업)
- 이번 아이디어의 핵심을 사용하기 위해서는 두개의 배열을 만들어야한다
3. 정지기준을 채운 사람을 반환한다
- 사용자의 리스트 배열을 돌며 그값을 이용해 신고받은 사람의 배열에 접근해 신고기준에 해당되는 사람을 새로운 배열에 담는다
4. 이사람을 신고한 사람을 찾는다
- 신고자의 배열수만큼 while문을 돌며 신고자배열을 돌며 몇번째에 겹치는지 찾는다 신고자의 인덱스를 찾기 위해서
5. 이제 누가 신고한지 알게 되었다 문제에서 받고자하는 리턴 양식으로 만들자
- 사용자의 리스트를 돌며 신고자 리스트를 카운트한다
++
위와같이 풀어서 결과를 받아봤더니 런타임 오류가 나왔다.. 분명 정상작동하는 코드인데 성능이 안나온다는 의미다
결국 다른 사람의 해답을 봤더니 처음 접근한 딕셔너리가 맞았다 하지만 딕셔너리를 100프로 이해하고 있던게 아니었다
신고를 받은 인원을 딕셔너리로 만들어 관리하고 마지막에 신고기준에 맞는 배열의 첫번째를 배열에 직접 던져서 찾고 인덱스를 받아서 증가한다 여기서 시간 감축의 핵심은 뭐니뭐니해도 id_list를 미리 사전에 길이만큼 0을 깔아두는 점이다 이렇게되면 인덱스만 받아서 더하면 되니까 찾는 시간에서 확 줄어든다.
'코딩 알고리즘_코드정리 > PYTHON' 카테고리의 다른 글
파이썬[코딩테스트] - 크레인 인형뽑기 (0) | 2022.04.26 |
---|---|
파이썬[코딩테스트] - 키패드 누르기 (0) | 2022.04.26 |
파이썬[코딩테스트] - 숫자 문자열과 영단어 (0) | 2022.04.20 |
파이썬[코딩테스트] - 신규아이디 추천 (0) | 2022.04.19 |
파이썬[코딩테스트] - 로또 최고순위 최저순위 (0) | 2022.04.19 |