프로그래머스 파이썬 기초 트레이닝 :: index, find 문제 모음 (str.rfind)
문제들
Day-11 (5) 가까운 1 찾기문제 이해
리스트나 문자열에서 원하는 값을 찾기 위해서, index 메서드를 사용할 수 있다.
index 메서드
list.index(value, start, stop)
str.index(value, start, stop)
문자열이랑 리스트에서 사용 가능하고, 값을 이용해 인덱스를 추출하는 메서드
최초로 찾는 값, 딱 하나를 반환한다.
------------------------------------------------
Day-11 (5) 가까운 1 찾기
코드 1
내가 처음에 푼 방식 : 새로운 리스트에 index 저장
def solution(arr, idx):
tmp = []
for i, val in enumerate(arr[idx:]) :
if val == 1 :
tmp.append(i+idx)
if len(tmp) :
return min(tmp)
else :
return -1
arr[idx: ]로 시작 인덱스를 슬라이싱한 뒤, 새로운 리스트인 tmp에 인덱스를 (i+idx) 로 저장했다.
그 뒤에, min 함수를 써서 최솟값 인덱스 추출
위의 코드를 줄이면, 아래와 같음
def solution(arr, idx):
tmp = [i+idx for i, val in enumerate(arr[idx:]) if val == 1]
return min(tmp) if len(tmp) else -1
코드 2
list.index(value, start, stop) 메서드 쓰기
def solution(arr, idx):
try :
return arr.index(1, idx)
except :
return -1
리스트에서 index 메서드를 쓸때, 해당 값이 없으면 오류가 발생하기 때문에 try - except 구문을 써야한다.
index 메서드로 반환되는 값은 최소로 찾은 인덱스를 반환하고, 없으면 오류 발생시킴
이 문제에서는 원하는 인덱스를 처음부터 찾는게 아니라, idx 값 이후부터 찾는 것이기 때문에 index 메서드의 두번째 매개변수(start)를 써야한다.
이 문제에서는 try - except 을 쓰지않고, if문 + in 연산자로도 가능 ↓
def solution(arr, idx):
if 1 in arr[idx:] :
return arr.index(1, idx)
else :
return -1
------------------------------------------------
Day-12 (4) 2의 영역
이 문제는 2가 등장하는 가장 왼쪽 인덱스 ~ 가장 오른쪽 인덱스를 찾는 문제이다.
오른쪽 인덱스를 구하는 메서드 없이, 푸는 방법이 여러개가 있어서 정리해봄.
특히, 코드 2번은 잘 기억해두자.
코드 1
def solution(arr):
tmp = []
for i, v in enumerate(arr) :
if v == 2 :
tmp.append(i)
if tmp :
return arr[min(tmp):max(tmp)+1]
else :
return [-1]
코드 2
list.index(value) 활용하기 ! 오른쪽 인덱스 찾는방법
def solution(arr):
if 2 not in arr:
return [-1]
return arr[arr.index(2) : len(arr) - arr[::-1].index(2)] # 오른쪽 index 찾는법 주의
가장 왼쪽 인덱스는 arr.index(2)로 찾으면 되고,
가장 오른쪽 인덱스는 arr를 역순으로 해서 인덱스를 찾아야한다.
arr[::-1].index(2) 이렇게 하면, 역순으로 몇번째 인덱스인지 알아내는거라서 전체 리스트 길이를 빼줘야한다.
오른쪽의 인덱스를 구하기 위해서, arr[::-1].index(2)만 하고 전체 리스트길이를 빼주지 않으면 아래처럼 값이 틀리게 나온다.
코드 3
신박한 방법 : pop으로 양쪽 필요 없는 부분 삭제
def solution(arr):
while arr and arr[-1] != 2: arr.pop()
arr = arr[::-1]
while arr and arr[-1] != 2: arr.pop()
return arr[::-1] or [-1]
코드 4
신박한 방법 : 검사
def solution(arr):
check, start , end = False, len(arr), 0
for idx, num in enumerate(arr) :
if num == 2:
check = True
start = min(start, idx)
end = max(end, idx)
if not check :
return [-1]
else :
return arr[start:end+1]
------------------------------------------------
Day-13 (3) 왼쪽 오른쪽
코드 1
def solution(str_list):
for i in range(len(str_list)) :
if str_list[i] == 'l' :
return str_list[:i]
elif str_list[i] == 'r' :
return str_list[i+1:]
return []
코드 2
list.index(value) + in / not in 연산자 활용
def solution(str_list):
if 'l' not in str_list and 'r' not in str_list : #주의. ('l' and 'r') not in 안됨
return []
if 'l' in str_list :
l = str_list.index('l')
else :
l = len(str_list)
if 'r' in str_list :
r = str_list.index('r')
else :
r = len(str_list)
if l < r :
return str_list[:l]
elif l > r :
return str_list[r+1:]
'l' 이랑(and) 'r' 를 안 가지는지(not in) 동시에 체크할려고
('l' and 'r' ) not in str_list 를 했지만, 오류가 남.
같이 체크는 안되고, if 'l' not in str_list and 'r' not in str_list 이렇게 나눠서 체크해야함
압축 버전
def solution(str_list):
if 'l' not in str_list and 'r' not in str_list : return []
l = str_list.index('l') if 'l' in str_list else len(str_list)
r = str_list.index('r') if 'r' in str_list else len(str_list)
return (str_list[:l] if l < r else str_list[r+1:] if l > r else [] )
------------------------------------------------
Day-17 (1) 특정 문자열로 끝나는 가장 긴 부분
코드 1
내가 푼 방법 : find 사용하기
def solution(myString, pat):
i = myString[::-1].find(pat[::-1])
idx = (i) * -1
return myString[:idx] if idx < 0 else myString[:]
index 메서드는 찾고자 하는 값이 없을때 오류를 반환하지만, 문자열에서만 사용할 수 있는 find 메서드는 값이 없을때 -1을 반환한다.
처음에 이 문제를 풀때는 rfind / rindex 메서드를 몰라서 최대한 find 메서드를 활용해서 문제를 풀었다.
코드 2
rfind 사용하기
def solution(myString, pat):
return myString[:myString.rfind(pat)] + pat
문자열을 출력할때, 두가지방법으로 표현할 수 있다.
[:myString.rfind(pat)] + pat 또는 [:myString.rfind(pat)+len(pat)]
def solution(myString, pat):
return myString[:myString.rfind(pat)+len(pat) ]
코드 3
lambda
solution = lambda myString, pat : myString[:myString.rfind(pat)]+ pat
solution = lambda myString, pat : myString[:myString.rfind(pat)+len(pat)]
댓글
댓글 쓰기