minzzl

[프로그래머스] - 스택/큐.같은 숫자는 싫어 본문

Algorithm/프로그래머스

[프로그래머스] - 스택/큐.같은 숫자는 싫어

minzzl 2023. 3. 6. 11:28
728x90
반응형

안녕하세요 !

원래는 어제 아래께에 풀기로 맘 먹었지만 ...

귀차니즘으로 오늘 풀게되었습니다 ... 하하 ~

뭐 풀면 된거죠 ~~ ^^

 

사실 문제 자체는 어렵지 않았습니다..

그런데 참 ... 다른 사람들의 코드를 보니 이건 정리해야겠더라구여 ...

어쩜 그렇게 다들 잘 하시는지 ... 정말 부럽습니다 ...

 

문제

 

풀이

사실 처음에는 조금 잘못 생각해서 삽질을 했습니다..

그냥 answer 배열에 없으면, 넣도록 하면 되지 않나? 하는 생각이었죠 ...

그런데 여기 문제에서 요구하는 것은 중복 값을 제거하라는 것이 아니라, 연속된 두 숫자만 하나로 작성하게 고치라는 것이었죠 !

다른 분들도 이 부분 헷갈리지마시고요 ...... 🥲

 

그래서 제가 선택한 방법은 ,

arr 배열의 원소들을 answer 배열에 넣을 건데,

넣기 전 !

answer 배열의 현재 길이를 알아내고, 그 배열의 마지막 원소가 현재 arr 배열에 원소랑 같이 않으면, 즉 연속되지 않으면 answer에 넣도록 하는 것입니다. 여기서도 주의 해야할 것은 answer 배열의 length 가 0 인 상황은 예외 처리를 해주어야 list out of range 오류가 나지 않습니다 .. ~!

 

나의 코드

 

def solution(arr):
    answer = []
    for index in arr:
        length = len(answer)
        if length == 0:
            answer.append(index)
        elif index != answer[length-1]:
            answer.append(index)
    
    return answer

 

다른 사람 코드

 

def no_continuous(s):
    # 함수를 완성하세요
    a = []
    for i in s:
        if a[-1:] == [i]: continue
        a.append(i)
    return a

 

저도 나름 잘 풀었다고 생각했는데 ... 다른 사람의 코드를 보니 참 간결하더군요 ...🥺

풀이의 흐름은 비슷하지만, 문자열 슬라이싱을 통해서 list index 사용을 아주 효율적으로 한 것 같습니다 !

 

그래서 그 김에 저도 다음번에 더 나은 풀이를 위해서 지금 정리 해보려구요 ... ~

 

제가 아래에 작성해 나갈 내용은 https://wikidocs.net/2838 https://www.freecodecamp.org/korean/news/how-to-substring-a-string-in-python/참고하여 작성하였습니다.

 

문자열 슬라이싱.. 그게 뭔데 ..

 

 파이썬은 다른 프로그래밍 언어에 비해 문자열을 매우 쉽게 다룰 수 있습니다. 먼저 hello world 라는 문자열에 대해 총 몇글자가 있는지 알아보겠습니다. 

>>> mystring  = 'hello world'
>>> len(mystring)
11
>>>

 

다음 코드를 실행하면 11이라는 값이 반환되는데, 이는 hello world 라는 문자열에 총 11개의 글자로 구성 돼 있다는 의미입니다. 그런데 왜 10자가 아니라 11자 일까요? 그것은 hello 와 world 단어 사이에 있는 공백도 문자로 간주하기 때문입니다.

 

그렇다면, "hello world" 라는 문자열 중에서 "hello" 라는 글자만 구하고 싶다면 어떻게 하면 될까요?

파이썬에서는 슬라이싱이라는 기능을 제공하는데, 다음과 같이 가져오고 싶은 문자열의 범위를 지정하면 됩니다. 참고로 slice 라는 영어 단어는 자르다, 일부, 한조각과 같은 의미가 있습니다.

 

>>> mystring[0:5]
'hello'
>>>

 

위 코드를 보면 [0:5]라는 표현을 사용했습니다. []는 슬라이싱 범위를 지정할 때 사용하는 기호이며, 0은 시작 위치를, 5는 끝위치를 의미합니다. 시작과 끝을 구분하기 위해 그 사이에 콜론(:)을 사용합니다.

 

그럼 조금 더 응용해보겠습니다. 

이번에는 world 의 단어를 가져오려면 어떻게 해야할까요?

네 맞습니다. 6부터 11까지 가져오면 됩니다.

 

>>> mystring[6:11]
'world'
>>>

 

위 코드의 문제점은 맨 마지막 글자의 위치를 세기가 참으로 귀찮다는 것입니다. 다행히도 파이썬의 슬라이싱에서는 시작값 또는 끝값을 생략하면 알아서 해당 문자열의 시작과 끝을 의미합니다. 

즉, 다음과 같이 작성할 수 있습니다.

 

>>> mystring[6:]
'world'
>>>

 

파이썬의 문자열 인덱싱에서 인덱스 값으로 양수만 사용할 수 있는 것은 아니고, 그림 2.10에서 처럼 음수를 사용할 수도 있습니다. 인덱스 값이 음수인 경우에는 문자열의 뒤쪽부터 역순으로 글자를 셉니다.

 

 

음수 인덱싱을 응용하면 다음 코드처럼 문자열에 접근할 수 있습니다. 

 

>>> mystring[6:-1]
'worl'
>>>

 

예시

 

1. 문자열의 첫 5문자를 슬라이싱하기

 

string = "freeCodeCamp"
print(string[0:5])

#freeC

 참고로 말하자면, print(string[:5])는 print(string[0:5])와 같은 결과를 반환합니다.

 

 

2. 문자열의 세번째 문자부터 시작하는 4자 길이의 부분 문자열을 추출하기

string = "freeCodeCamp"
print(string[2:6])

#eeCo

 

3. 문자열의 마지막 문자 추출하기

string = "freeCodeCamp"
print(string[-1])

#p

 

4. 문자열의 마지막 5자를 부분 문자열로 추출하기

string = "freeCodeCamp"
print(string[-5:])

#eCamp

 

 

5. 첫번째 문자와 마지막 4개의 문자를 제외한 부분 문자열 추출하기

string = "freeCodeCamp"
print(string[1:-4])

#reeCode

 

6. 문자열 내 두칸 간격으로 슬라이싱하기

string = "freeCodeCamp"
print(string[::2])

#feCdCm

 

이제 문자 슬라이싱에 대해 알았으니 ...

아까전의 코드를 다시 볼까요?

 

def no_continuous(s):
    # 함수를 완성하세요
    a = []
    for i in s:
        if a[-1:] == [i]: continue
        a.append(i)
    return a

 

이전에 제가 풀이에서 결과 값을 넣는 배열에 새로운 값을 넣고자 할 때, 해당 배열의 젤 마지막 값을 보고, 넣고자하는 새로운 값과 그 마지막 값이 같지 않으면 넣는다라고 했었는데요,

 

if a[-1:] == [i]: continue

 부분이 위의 내용을 포함하고 있습니다.

 

저는 이를 위해 3-4줄 가량을 썼었는데.... 

한줄에 ^^ 

 

저도 빨리 실력이 늘길 기도하며 마치겠습니당

728x90
반응형