본문 바로가기

무작정 따라해보기(정리, 문제풀기)/어서와! 자료구조와 알고리즘은 처음이지?

리스트에서 원소 찾아내기(python 코드)

728x90

 

"어서와! 자료구조와 알고리즘은 처음이지?" 강의의 리스트에서 원소 찾아내기 문제를 풀고 고치는 과정을 기록합니다.

 

def solution(L, x):
    answer = []
    for i in range(len(L)):
        if x == L[i]:
            answer.append(i)
    if len(answer)==0:
        answer.append(-1)
    return answer

일단 처음에는 for문 돌면서 x와 비교를 하면서 인덱스를 넣어주고 길이가 0, 즉 아무것도 들어오지 않았으면 리스트에 -1만을 넣어주는 방식으로 풀었어요.
처음에는 이렇게 풀었는데 힌트를 참고하여 다시 풀어보기로 했어요!

 

def solution(L, x):
    answer = []
    if x in L:
        for i in range(len(L)):
            if x == L[i]:
                answer.append(i)
    else:
        answer.append(-1);

    return answer

이번에는 리스트에 x가 포함되지 않았다면 -1을 넣어주고 그렇지 않으면 아까의 방법처럼 x가 들어있는 L의 인덱스를 answer에 append해주는 방법으로 풀었어요.
근데 리스트 슬라이싱으로는 어떻게 푸는지 감이 안오더라고요 그래서 다른 사람의 풀이를 참고해봤어요!

 

def solution(L, x):
    answer = []
    idx = -1
    currIdx = 0
    while x in L:
        idx = L.index(x)
        answer.append(idx + currIdx)
        currIdx += idx+1
        L = L[idx+1:]

    if idx == -1:
        answer.append(-1)

    return answer

다른 사람의 풀이를 참고하며 이렇게 리스트 슬라이싱을 사용하여서 풀어보았어요. 좋은 방법인 것 같아요. 역시 !

리스트 안에 x가 있는 동안 반복을 하면서

L 리스트에서 x가 있는 위치의 인덱스를 idx에 넣어주고

그 idx+currIdx를 answer에 추가해줍니다.

그리고 currIdx에 리스트의 현재 x의 인덱스 위치+1를 누적합니다. 그 이유는 x가 여러개 있다면 계속 추가를 해줘야 하기 때문이고 +1을 해주는 이유는 슬라이싱을 하면 0부터 시작함으로 idx+currIdx를 하면 하나 적은 인덱스가 저장되기 때문입니다.

그리고 현재 x의 인덱스 뒤의 내용을 잘라서 L에 넣어줍니다.

다음 반복을 하면 슬라이싱이 된 L에서 x의 인덱스를 찾고 이전 L 리스트의 x 위치 + 1의 위치와 슬라이싱이 된 L 리스트의 x 인덱스 위치를 더해줍니다. 슬라이싱이 된 리스트는 0부터 시작하고, 이전 리스트는 x를 찾은 위치의 바로 뒤부터 슬라이싱을 하기 때문에 아까 currIdx에 1을 더해준겁니다.

 

이상 있으면 댓글 남겨주시면 감사하겠습니다.^^