4 분 소요

리스트 자르기


문제 설명

정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러 개가 담긴 리스트 num_list가 주어집니다. slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.

  • n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
  • n = 2 : num_lista번 인덱스부터 마지막 인덱스까지
  • n = 3 : num_lista번 인덱스부터 b번 인덱스까지
  • n = 4 : num_lista번 인덱스부터 b번 인덱스까지 c 간격으로

올바르게 슬라이싱한 리스트를 return하도록 solution 함수를 완성해주세요.


제한사항

  • n 은 1, 2, 3, 4 중 하나입니다.
  • slicer의 길이 = 3
  • slicer에 담긴 정수를 차례대로 a, b, c라고 할 때
    • 0 ≤ a ≤ b ≤ num_list의 길이 - 1
    • 1 ≤ c ≤ 3
  • 5 ≤ num_list의 길이 ≤ 30
  • 0 ≤ num_list의 원소 ≤ 100

solution

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

입출력 예

n slicer num_list result
3 [1, 5, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 3, 4, 5, 6]
4 [1, 5, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 4, 6]

첫 번째로 나오는 음수


문제 설명

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


제한사항

  • 5 ≤ num_list의 길이 ≤ 100
  • -10 ≤ num_list의 원소 ≤ 100

solution

def solution(num_list):
    for i, v in enumerate(num_list):
        if v < 0:
            return i
    return -1
-----------------------------------------
다른 풀이

def solution(num_list):
    for i in range(len(num_list)):
        if num_list[i]<0:return i
    return -1

입출력 예

num_list result
[12, 4, 15, 46, 38, -2, 15] 5
[13, 22, 53, 24, 15, 6] -1

배열 만들기 3


문제 설명

정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어집니다.

intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다.

이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.


solution

def solution(arr, intervals):
    answer = []
    for x, v in intervals:
        answer.append(arr[x:v+1])
    return sum(answer, [])
-----------------------------------
다른 풀이
def solution(arr, intervals):
    answer = []
    for a,b in intervals: answer+=arr[a:b+1]
    return answer
-----------------------------------
다른 풀이
def solution(arr, intervals):
    return arr[intervals[0][0]:intervals[0][1] + 1] + arr[intervals[1][0]:intervals[1][1] + 1]

제한사항

  • 1 ≤ arr의 길이 ≤ 100,000
    • 1 ≤ arr의 원소 < 100
  • 1 ≤ a1b1 < arr의 길이
  • 1 ≤ a2b2 < arr의 길이

입출력 예

arr intervals result
[1, 2, 3, 4, 5] [[1, 3], [0, 4]] [2, 3, 4, 1, 2, 3, 4, 5]

2의 영역🔪


문제 설명

정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.

단, arr에 2가 없는 경우 [-1]을 return 합니다.


제한사항

  • 1 ≤arr의 길이 ≤ 100,000
    • 1 ≤ arr의 원소 ≤ 10

solution

def solution(arr):
    answer = []
    
    if 2 in arr:
        if arr.count(2) > 1:
            start = arr.index(2)
            end = len(arr) - arr[::-1].index(2)
            return arr[start:end]
        else:
            idx = arr.index(2)
            return [arr[idx]]
    else:
        return [-1]
    
    return answer
---------------------------------------------------
def solution(arr):
    if 2 not in arr:
        return [-1]
    return arr[arr.index(2) : len(arr) - arr[::-1].index(2)]

입출력 예

arr result
[1, 2, 1, 4, 5, 2, 9] [2, 1, 4, 5, 2]
[1, 2, 1] [2]
[1, 1, 1] [-1]
[1, 2, 1, 2, 1, 10, 2, 1] [2, 1, 2, 1, 10, 2]
느낀 점 뭔가 아직까지 return과 그 적용 범위에 대해 다시 공부 해야겠습니다.

배열 조각하기


문제 설명

정수 배열 arrquery가 주어집니다.

query를 순회하면서 다음 작업을 반복합니다.

  • 짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.
  • 홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.

위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 5 ≤arr의 길이 ≤ 100,000
    • 0 ≤ arr의 원소 ≤ 100
  • 1 ≤query 길이 < min(50,arr의 길이 / 2)
    • query의 각 원소는 0보다 크거나 같고 남아있는 arr의 길이 보다 작습니다.

solution

def solution(arr, query):
    new = []
    for i, v in enumerate(query):
        if i % 2 == 0:
            del (arr[:v:-1])
        else:
            del (arr[:v])
    return arr
-----------------------------------------
def solution(arr, query):
    for k, q in enumerate(query):
        if k % 2 == 0:
            arr = arr[:q + 1]
        else:
            arr = arr[q:]
    return arr

입출력 예

arr query result
[0, 1, 2, 3, 4, 5] [4, 1, 2] [1, 2, 3]

📝 파이썬 리스트 요소 삭제: clear, del, remove, pop

del 구문: 인덱스나 슬라이스로 특정 범위의 요소를 삭제

>>> del arr[0:2]
>>> print(arr)
[2,3,4,5]

리스트의 인덱스 범위가 넘어가지 않도록 주의 해주세요.

clear(): 리스트의 모든 요소를 삭제합니다.

remove(): 입력한 값을 검색해서 삭제합니다. 값이 중복될 경우에는 첫 번째 검색 결과를 삭제합니다.

>>> arr = [0, 1, 2, 3, 4, 5]
>>> arr.remove(3)
>>> print(arr)

[0, 1, 2, 4, 5]

pop(): 맨 뒤의 값을 삭제합니다. 인자를 지정할 경우 특정 위치의 값을 삭제합니다.

>>> arr = [0, 1, 2, 3, 4, 5]
>>> print(arr.pop())
[0, 1, 2, 3, 4]

>>> print(arr.pop(2))
[0, 1, 3, 4, 5]

pop() 메서드의 기본적인 원리상 중간에 있는 값을 지정할 경우 시간 복잡도가 O(n)이므로 주의가 필요합니다.

댓글남기기