JSITCLUB

파이썬 - 프로그래머스 - 같은 숫자는 싫어 본문

파이썬/문제풀이

파이썬 - 프로그래머스 - 같은 숫자는 싫어

jsitclub 2020. 8. 10. 13:15

문제 설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 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]

입출력 예 설명

입출력 예 #1,2
문제의 예시와 같습니다.

 

 

 

코딩테스트 연습 - 같은 숫자는 싫어

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은

programmers.co.kr

풀이 및 코드

문제 요약

리스트에서 연속적으로 중복되는 숫자는 하나씩만 보여주기

문제 해설

이 문제는 접근을 두가지 방법으로 할 수 있습니다.

주어진 리스트의 값을 하나씩 읽어 오면서, 이전수와 비교하는 방법 과 다음 수와 비교하는 방법 입니다.

두 가지 방법 중 어느것을 선택하든 방법은 비슷하니 이전 수와 비교하는 방법을 이용하겠습니다.

 값을 읽어와서 이전수와 다르면 결과 리스트에 넣는 것 입니다.

 

이 때 주의 해야 할것이 있습니다. 바로 반복횟수 입니다.

지금까지 보아온 문제들은 모두 리스트의 길이 번 반복 하면서 각각의 값을 조건에 맞는지 확인 했지만, 이번에는 앞수와 뒤수를비교하는 문제이므로 반복횟수는 (리스트 길이-1) 번 해야 합니다.

[1,1,3,3,0,1,1]를 예로 들면 길이는 7 이지만 1과1, 1과3, 3과3, 3과0, 0과1, 1과1  처럼 비교는 총 6번 하게 되는것 입니다. 이 이야기를 다른 말로 하면 이전 수와 비교 해야 하므로 반복을 2번째 부터 시작해야 한다 이야기 입니다.

 

반복문에서 몇번째인지 는 어떻게 알 수 있을까요?

다음 방법을 사용하면 값들의 인덱스를 알 수 있게 됩니다.

a=[1,1,3,3,0,1,1]

for i in range(len(a)):
	print("i = ",i," : a[",i,"] = ",a[i],sep="")


#결과
i = 0: a[0] = 1
i = 1: a[1] = 1
i = 2: a[2] = 3
i = 3: a[3] = 3
i = 4: a[4] = 0
i = 5: a[5] = 1
i = 6: a[6] = 1

 

그러면 이 방법을 이용해서 현재의 숫자와 앞의 숫자를 비교할 수 있게 됩니다.

 

결과 코드

def solution(arr):
    
	answer = [arr[0]]		#맨처음값을 결과에 넣어준다.
	for i in range(1,len(arr)):
		if arr[i-1]!=arr[i]:		#이전값과 현재값 비교 
			answer.append(arr[i])
	return answer

 

주의 !!

이와같은 문제를 풀때 흔히 하는 실수 중에  같으면 지우는 방법을 사용하는 분들이 있는데, 이 방법도 가능은 하지만, 조심할 점이 있습니다.

바로 반복문에 사용하는 리스트의 요소를 지우는  입니다.

 

예를 들어 [0,1,2,3,4,5,6,7,8,9,10]에서 짝수만 지우려고 할때 다음과 같이 코딩하는 경우가 있습니다.

a=[0,1,2,3,4,5,6,7,8,9,10]
for i in range(len(a)):	
	if i%2==0:
		a.pop(i)
	print(i,a)

 그냥 봐서는 별 문제 없어 보이지만 결과는  다음과 같습니다.

0 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2 [1, 2, 4, 5, 6, 7, 8, 9, 10]
3 [1, 2, 4, 5, 6, 7, 8, 9, 10]
4 [1, 2, 4, 5, 7, 8, 9, 10]
5 [1, 2, 4, 5, 7, 8, 9, 10]
6 [1, 2, 4, 5, 7, 8, 10]
7 [1, 2, 4, 5, 7, 8, 10]
Traceback (most recent call last):
  File "/home/iamm00n/programming/project/python/test1.py", line 4, in <module>
    a.pop(i)
IndexError: pop index out of range

왜 그럴까요?

결과에서 보는 것과 같이

0 번째에서는 a[0]를 잘 지웠습니다. 하지만 여기서 지워지면서 a의 내용이 바뀌어 버렸죠.

때문에 a[2]번째를 지울땐 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]에서 작업을 하기 때문에 2 가 아닌 3이 지워지게 됩니다.

 

이 문제를 해결하는 방법은 결과를 다른 리스트에 담는 방법 과 위치를 나타내는 i를 직접 감안해서 계산하는 방법입니다.

 

a=[0,1,2,3,4,5,6,7,8,9,10]

i = 0
for n in a:	
	if i%1==0:
		a.pop(i)
	i+=1	
	print(a)

 

수고하셨습니다.

 

 

Comments