일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 백준
- 알고리즘 풀이
- API
- Baekjoon
- Git
- form
- java
- Django
- django widget
- es6
- c++
- django ORM
- web
- django rest framework
- 알고리즘 문제
- 장고
- Algorithm
- 알고리즘 연습
- AWS
- 파이썬 알고리즘
- MAC
- 알고리즘
- 파이썬
- react
- js
- HTML
- PYTHON
- CSS
- DRF
- javascript
- Today
- Total
수학과의 좌충우돌 프로그래밍
같은 숫자는 싫어(프로그래머스-level1) 본문
안녕하세요 강민성입니다.
오랜만에 알고리즘 공부를 하니 level 1 문제도 잘 안풀리더라고요.
프로그래머스는 그 문제를 푼 사람수를 알려주는데 level 1 에서 가장 어려운 문제이긴 했습니다.
반성하며 다시 으쌰으쌰해서 공부해볼까 합니다.
그러면 문제를 봐보도록 하겠습니다.
처음에는 arr 배열에서 연속된 수가 나오면 그 수를 배열에서 삭제하고 arr 를 return 할려고 했습니다.
실력이 부족한 것인지는 모르겠지만 time complexity 에 걸리고 말았습니다.
그래서 새로운 리스트를 만들어서 그 안에 넣어주었습니다.
코드를 통해 확인을 해보면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def solution(arr): answer = [] # 답이 될 빈 배열을 만들어준다. count = 0 for i in arr: # arr 안에 있는 값들을 돌아준다. if len(answer) == 0: # 처음에는 answer 안에 아무 값도 없으므로 answer.append(i) # 값을 대입해주고 if i == answer[count]: # answer안에 들어있는 값과 arr 의 값이 같으면 continue # answer에 넣으면 안되니까 continue 해주고 else: # arr 배열 안의 값이 answer에 있는 값과 다르면 answer.append(i) # 그 값을 answer 리스트안에 넣어주고 count += 1 #answer[count]가 방금 넣은 값을 가르키도록 count 를 1 올려준다. return answer | cs |
다음과 같습니다.
전체적인 코드에 대하여 설명을 드리자면
arr 리스트 안에서 연속이 되지 않으면 answer 리스트로 옮기게 됩니다.
answer 에 아무것도 들어있지 않으면 arr 에 있는 성분을 넘겨주고
그 뒤로 부터는 직전에 옮긴 answer의 성분과 arr의 성분을 비교해서 옮길지 말지 결정하게 됩니다.
비슷하지만 조금 더 좋은 풀이를 봐보실까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 | def solution(arr): answer = [] # 빈 리스트 생성 for i in arr: # arr 안의 성분을 하나씩 돌면서 if answer[-1:] == [i]: # 마지막의 원소와 i 가 같으면 continue # continue를 answer.append(i) # 마지막 원소와 i가 다르면 answer에 i를 넣어준다. return answer | cs |
위에 코드에서 count를 써가면서 answer의 마지막 원소를 indexing 하려고 했습니다.
그리고 answer이 비어있을 때에 대해서는 따로 if 문을 걸어줬었죠.
그 두 개를 모두 깔끔하게 해결했습니다.
indexing 을 할 때 -1 을 사용하며 마지막 원소를 지칭해주었습니다.
그리고 가장 놀라운건 answer[-1:] 이라는 생각이 드네요.
[-1:] 다음과 같이 indexing 을 해주게 되면 -1이 가르치는 마지막 원소부터 마지막까지 뽑아내게 됩니다.
언뜻 보기에는 answer[-1] 과 뭐가 다를까라고 생각할 수도 있지만 answer[-1:] 은 answer이 빈 리스트여도 오류가 없습니다!
그리고 출력을 리스트로 하기 때문에 비교도 i 가 아닌 [i] 와 해준 것이죠.
마무리
항상 알고리즘 문제를 풀고보면 제 풀이보다 좋은 풀이가 있는 거 같습니다 ㅠㅠ
나름 최선의 코드를, 가장 짧은 시간을 소요한다고 생각해도 더 번뜩이는 아이디어들이 있더라고요.
좀 더 노력해서 최선의 코드를 짜보도록 하겠습니당!
화이팅!!
'알고리즘 > 파이썬' 카테고리의 다른 글
핸드폰 번호 가리기(프로그래머스-level1) (0) | 2018.09.07 |
---|---|
시저암호(프로그래머스-level1) (1) | 2018.09.06 |
땅따먹기(프로그래머스-level2) (4) | 2018.08.07 |
올바른 괄호의 갯수(프로그래머스-level4) (2) | 2018.08.01 |
하노이의 탑(프로그래머스-level3) (1) | 2018.07.30 |