수학과의 좌충우돌 프로그래밍

같은 숫자는 싫어(프로그래머스-level1) 본문

알고리즘/파이썬

같은 숫자는 싫어(프로그래머스-level1)

ssung.k 2018. 9. 6. 20:48

안녕하세요 강민성입니다.


오랜만에 알고리즘 공부를 하니 level 1 문제도 잘 안풀리더라고요.


프로그래머스는 그 문제를 푼 사람수를 알려주는데 level 1 에서 가장 어려운 문제이긴 했습니다.


반성하며 다시 으쌰으쌰해서 공부해볼까 합니다.


그러면 문제를 봐보도록 하겠습니다.



[문제]

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다.

이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다.

배열 arr에서 제거 되고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다.

예를들면

arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.

arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

제한사항

배열 arr의 크기 : 1,000,000 이하의 자연수

배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

입출력 예

arr  answer

[1,1,3,3,0,1,1]  [1,3,0,1]

[4,4,4,3,3]   [4,3]



처음에는 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] 와 해준 것이죠.




마무리


항상 알고리즘 문제를 풀고보면 제 풀이보다 좋은 풀이가 있는 거 같습니다 ㅠㅠ


나름 최선의 코드를, 가장 짧은 시간을 소요한다고 생각해도 더 번뜩이는 아이디어들이 있더라고요.


좀 더 노력해서 최선의 코드를 짜보도록 하겠습니당! 


화이팅!!


Comments