Day12 리스트(배열)

  • 리스트 자르기
  • 첫 번째로 나오는 음수
  • 배열 만들기 3
  • 2의 영역
  • 배열 조각하기

리스트 자르기

문제 설명

정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러 개가 담긴 리스트 num_list가 주어집니다. slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.
n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
n = 2 : num_list의 a번 인덱스부터 마지막 인덱스까지
n = 3 : num_list의 a번 인덱스부터 b번 인덱스까지
n = 4 : num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로 올바르게 슬라이싱한 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(n, slicer, num_list):
    answer = []
    a, b, c = slicer[0], slicer[1], slicer[2]
    if n == 1: answer = num_list[0:b+1]
    elif n == 2: answer = num_list[a:]
    elif n == 3: answer = num_list[a:b+1]
    else: answer = num_list[a:b+1:c]
    return answer
a, b, c = slicer

배열 값을 각 변수에 저장하는데 이렇게 간단하게도 할 수 있었다 역시 파이썬 


첫 번째로 나오는 음수

문제 설명

정수 리스트 num_list가 주어질 때, 첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 음수가 없다면 -1을 return합니다.

 

def solution(num_list):    
    answer = [idx for idx, value in enumerate(num_list) if value < 0]
    return answer[0] if answer else -1

리스트 컴프리헨션 표현식은 대괄호로 리스트를 생성해서 바로 정수를 출력하지 못했다

그래서 답이 5이면 [5]로 테스트 실패

근데 어차피 결과값은 1개뿐이니 리스트의 0번째 인덱스를 출력하도록 함!


배열 만들기 3

문제 설명

정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어집니다.intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다.이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.

 

def solution(arr, intervals):
    a, b = intervals 
    return arr[a[0]:a[1]+1]+arr[b[0]:b[1]+1]

배열 intervals의 꼴은 항상 같으니 배열 하나씩 저장하고 인덱스를 활용하여 풀었다.

def solution(arr, intervals):
    s1, e1 = intervals[0]
    s2, e2 = intervals[1]
    return arr[s1:e1+1] + arr[s2:e2+1]

비슷한 풀이지만 가독성이 더 좋아보이는 코드


2의 영역

문제 설명

정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.단, arr에 2가 없는 경우 [-1]을 return 합니다.

def solution(arr):
    answer = []
    idx_range = [idx for idx, value in enumerate(arr) if value == 2]
    min_range = min(idx_range, default=-1)
    max_range = max(idx_range, default=-1)
    
    return arr[min_range:max_range+1] if arr[min_range:max_range+1] else [-1]

배열 안에서 값이 2인 인덱스를 모두 찾고

2인 인덱스의 최소, 최대를 구해서,

최대, 최소 인덱스의 값을 포함한 배열을 리턴하도록 했다.

근데 -1을 깔끔하게 처리하지는 못한 것 같음.

최소, 최대 구할 때 배열이 빈 값이면 ValueError가 나서 기본 값을 임의로 -1로 정해두기도 함. 

def solution(arr):
    if 2 not in arr:
        return [-1]
    return arr[arr.index(2) : len(arr) - arr[::-1].index(2)]​

다른 사람 풀이 :

앞쪽부터 순회해서 값이 2인 인덱스 번호

뒤쪽부터 순회해서 값이 2인 인덱스 번호를 찾아서 슬라이싱

 

arr[::-1].index(2) > 역순 순회해서 인덱스를 구하고,

그 값 전체 길이에서 빼줘야 내가 최종으로 구하는 인덱스 값이 나온다.

len(arr) - arr[::-1].index(2)

 

깔끔하다.. 


배열 조각하기

문제 설명

정수 배열 arr와 query가 주어집니다.query를 순회하면서 다음 작업을 반복합니다.짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.

 

def solution(arr, query):
    for i, query in enumerate(query):
        if i % 2 == 0:
            arr = arr[:query+1]
        else:
            arr = arr[query:]
    return arr

며칠 연속으로 리스트, 배열, 문자열 연습하니까 조금씩 감이 오는 것 같다!

쉽지만 쉽지 않은 것들 .. 기초 단계에서 다양한 풀이들을 잘 익히고 넘어가야겠다

오늘도~ 성공~

+ Recent posts