프로그래머스 기초문제

[프로그래머스 기초문제] Day 12 리스트(배열)

Devleoper_yh 2025. 3. 1. 01:09
반응형

1. 리스트 자르기

정수 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 함수를 완성해주세요.


제한사항

  • 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

입출력 예

n slicer num_list  
       
       

입출력 예 설명

입출력 예 #1

  • [1, 2, 3, 4, 5, 6, 7, 8, 9]에서 1번 인덱스부터 5번 인덱스까지 자른 리스트는 [2, 3, 4, 5, 6]입니다.

입출력 예 #2

  • [1, 2, 3, 4, 5, 6, 7, 8, 9]에서 1번 인덱스부터 5번 인덱스까지 2개 간격으로 자른 리스트는 [2, 4, 6]입니다.

제출 답안

import Foundation

func solution(_ n: Int, _ slicer: [Int], _ num_list: [Int]) -> [Int] {
    // slicer 리스트에서 a, b, c 값을 추출
    let (a, b, c) = (slicer[0], slicer[1], slicer[2])

    switch n {
    case 1:
        // num_list의 0번 인덱스부터 b번 인덱스까지 슬라이싱
        return Array(num_list[0...b])
    case 2:
        // num_list의 a번 인덱스부터 마지막까지 슬라이싱
        return Array(num_list[a...])
    case 3:
        // num_list의 a번 인덱스부터 b번 인덱스까지 슬라이싱
        return Array(num_list[a...b])
    case 4:
        // num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로 슬라이싱
        return stride(from: a, through: b, by: c).map { num_list[$0] }
    default:
        // n이 1~4가 아닌 경우 빈 배열 반환
        return []
    }
}

2. 첫 번째로 나오는 음수

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


제한사항

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

입출력 예

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

입출력 예 설명

입출력 예 #1

  • 5번 인덱스에서 음수가 처음 등장하므로 5를 return합니다.

입출력 예 #2

  • 음수가 없으므로 -1을 return합니다.

제출 답안

import Foundation

func solution(_ num_list:[Int]) -> Int {
    if let result = num_list.firstIndex(where:  { $0 < 0 }) {
        return result
    }
    return -1
}

 


3. 배열 만들기 3

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

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

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


제한사항

  • 1 ≤ arr의 길이 ≤ 100,000
    • 1 ≤ arr의 원소 < 100
  • 1 ≤ a1  b1 < arr의 길이
  • 1 ≤ a2  b2 < arr의 길이

입출력 예

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

입출력 예 설명

입출력 예 #1

  • 첫 번째 구간에 해당하는 배열은 [2, 3, 4] 입니다.
  • 두 번째 구간에 해당하는 배열은 [1, 2, 3, 4, 5] 입니다.
  • 따라서 이 두 배열을 앞뒤로 붙인 배열인 [2, 3, 4, 1, 2, 3, 4, 5]를 return 합니다.

제출 답안

func solution(_ arr: [Int], _ intervals: [[Int]]) -> [Int] {
    // 첫 번째 구간의 시작과 끝 인덱스
    let (a1, b1) = (intervals[0][0], intervals[0][1])
    // 두 번째 구간의 시작과 끝 인덱스
    let (a2, b2) = (intervals[1][0], intervals[1][1])
    
    // 첫 번째 구간과 두 번째 구간을 슬라이싱하여 합친 배열 반환
    return Array(arr[a1...b1]) + Array(arr[a2...b2])
}

4. 2의 영역

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

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


제한사항

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

입출력 예

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]

입출력 예 설명

입출력 예 #1

  • 2가 있는 인덱스는 1번, 5번 인덱스뿐이므로 1번부터 5번 인덱스까지의 부분 배열인 [2, 1, 4, 5, 2]를 return 합니다.

입출력 예 #2

  • 2가 한 개뿐이므로 [2]를 return 합니다.

입출력 예 #3

  • 2가 배열에 없으므로 [-1]을 return 합니다.

입출력 예 #4

  • 2가 있는 인덱스는 1번, 3번, 6번 인덱스이므로 1번부터 6번 인덱스까지의 부분 배열인 [2, 1, 2, 1, 10, 2]를 return 합니다.

제출 답안

import Foundation

func solution(_ arr: [Int]) -> [Int] {
    // 배열 arr에서 첫 번째로 등장하는 2의 인덱스를 찾음
    guard let firstIndex = arr.firstIndex(of: 2),
          // 배열 arr에서 마지막으로 등장하는 2의 인덱스를 찾음
          let lastIndex = arr.lastIndex(of: 2) else {
        // 배열에 2가 하나도 없으면 [-1] 반환
        return [-1]
    }
    
    // 첫 번째 2부터 마지막 2까지의 구간을 슬라이싱하여 반환
    return Array(arr[firstIndex...lastIndex])
}

5. 배열 조각하기

정수 배열 arr와 query가 주어집니다.

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의 길이 보다 작습니다.

입출력 예

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

입출력 예 설명

입출력 예 #1

  • 이번에 매번 처리할 query의 값과 처리 전후의 arr의 상태를 표로 나타내면 다음과 같습니다.
query의 값 query 처리 전 query 처리 후 비고
4 [0, 1, 2, 3, 4, 5] [0, 1, 2, 3, 4] 0번 인덱스의 쿼리이므로 뒷부분을 자른다.
1 [0, 1, 2, 3, 4] [1, 2, 3, 4] 1번 인덱스의 쿼리이므로 앞부분을 자른다.
2 [1, 2, 3, 4] [1, 2, 3] 2번 인덱스의 쿼리이므로 뒷부분을 자른다.
  • 따라서 [1, 2, 3]을 return 합니다.

제출 답안

import Foundation

func solution(_ arr: [Int], _ query: [Int]) -> [Int] {
    var result = arr  // 원본 배열을 수정할 변수
    
    for (index, value) in query.enumerated() {
        if index % 2 == 0 {
            // 짝수 인덱스: query[i] 이후의 요소를 버림 (query[i] 포함)
            result = Array(result[0...value])
        } else {
            // 홀수 인덱스: query[i] 이전의 요소를 버림 (query[i] 포함)
            result = Array(result[value...])
        }
    }
    
    return result
}

Day 12

반응형