프로그래머스 기초문제

[프로그래머스 기초문제] Day 6 조건문, 반복문

Devleoper_yh 2025. 2. 20. 22:49
반응형

1. 마지막 두 원소

정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.


제한사항

  • 2 ≤ num_list의 길이 ≤ 10
  • 1 ≤ num_list의 원소 ≤ 9

입출력 예

num_list result
[2, 1, 6] [2, 1, 6, 5]
[5, 2, 1, 7, 5] [5, 2, 1, 7, 5, 10]

입출력 예 설명

입출력 예 #1

  • 마지막 원소인 6이 그전 원소인 1보다 크기 때문에 6 - 1인 5를 추가해 return합니다.

입출력 예 #2

  • 마지막 원소인 5가 그전 원소인 7보다 크지 않기 때문에 5의 두 배인 10을 추가해 return합니다.

제출 답안

import Foundation

func solution(_ num_list:[Int]) -> [Int] {
    // 배열의 맨 마지막 값을 구하기 위해 개수 도출
    let lastNum = num_list.count - 1
    let behindNum  = num_list.count - 2
    var result = 0
    
    if num_list[lastNum] > num_list[behindNum] {
        result = num_list[lastNum] - num_list[behindNum]
        return num_list + [result]
    } else {
        result = num_list[lastNum] * 2
        return num_list + [result]
    }
}

2. 수 조작하기 1

정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.

  • "w" : n이 1 커집니다.
  • "s" : n이 1 작아집니다.
  • "d" : n이 10 커집니다.
  • "a" : n이 10 작아집니다.

위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.


제한사항

  • -100,000 ≤ n ≤ 100,000
  • 1 ≤ control의 길이 ≤ 100,000
    • control은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.

입출력 예

n control result
0 "wsdawsdassw" -1

 


입출력 예 설명

입출력 예 #1

  •  n은 control에 따라 다음과 같은 순서로 변하게 됩니다.
  • 0 → 1 → 0 → 10 → 0 → 1 → 0 → 10 → 0 → -1 → -2 → -1
  • 따라서 -1을 return 합니다.

제출 답안

import Foundation

func solution(_ n:Int, _ control:String) -> Int {
    
    var result = n
    // control을 앞에서부터 하나씩 읽어가며 n에 더하기 빼기하기
    for s1 in control {
        switch s1 {
            case "w":
            result += 1
            
            case "s":
            result -= 1
            
            case "d":
            result += 10
            
            case "a":
            result -= 10
            
            default:
            break
        }
    }
    return result
}

3. 수 조작하기 2

정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.

  • "w" : 수에 1을 더한다.
  • "s" : 수에 1을 뺀다.
  • "d" : 수에 10을 더한다.
  • "a" : 수에 10을 뺀다.

그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.

주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 2 ≤ numLog의 길이 ≤ 100,000
    • -100,000 ≤ numLog[0] ≤ 100,000
    • 1 ≤ i  numLog의 길이인 모든 i에 대해 |numLog[i] - numLog[i - 1]|의 값은 1 또는 10입니다.

입출력 예

numLog result
[0, 1, 0, 10, 0, 1, 0, 10, 0, -1, -2, -1] "wsdawsdassw"

 


입출력 예 설명

입출력 예 #1

  • result인 "wsdawsdassw"를 따라 numLog[0]에서부터 시작해 조작을 하면 numLog의 값과 순서대로 일치합니다. 따라서 "wsdawsdassw"를 return 합니다.

Hint

"수 조작하기 1" 문제의 n값이 numLog[0]에 해당하며, 이 문제에서 주어진 numLog에 따라 "수 조작하기 1" 문제의 control을 구하는 문제라고 이해할 수 있습니다.

입출력 예 #1은 "수 조작하기 1" 문제의 입출력 예 #1과 같은 예시이므로 참고하시기 바랍니다.

 

제출 답안

import Foundation

func solution(_ numLog:[Int]) -> String {
    // 문자열 저장
    var result = ""
    
    // i번 조작 횟수는 1번 부터 시작
    for i in 1..<numLog.count {
        // 배열 인덱스 1번과 그 전의 숫자 차이를 구해야 하기 때문에 i - 1
        // 제한 사항에 힌트가 있음
        let diff = numLog[i] - numLog[i - 1]
        switch diff {
            case 1:
            result.append("w")
            case -1:
            result.append("s")
            case 10:
            result.append("d")
            case -10:
            result.append("a")
            default:
            break
        }    
    }
    return result
}

4. 수열과 구간 쿼리 3

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.

 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.

위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 1 ≤ arr의 길이 ≤ 1,000
    • 0 ≤ arr의 원소 ≤ 1,000,000
  • 1 ≤ queries의 길이 ≤ 1,000
    • 0 ≤ i < j < arr의 길이

입출력 예

arr queries result
[0, 1, 2, 3, 4] [[0, 3], [1, 2], [1, 4]] [ 3, 4, 1, 0, 2]

입출력 예 설명

입출력 예 #1

  • 각 쿼리에 따라 arr가 다음과 같이 변합니다.
arr
[0, 1, 2, 3, 4]
[3, 1, 2, 0, 4]
[3, 2, 1, 0, 4]
[3, 4, 1, 0, 2]
  • 따라서 [3, 4, 1, 0, 2]를 return 합니다.

제출 답안

import Foundation

func solution(_ arr: [Int], _ queries: [[Int]]) -> [Int] {
    // arr를 변경 가능한 변수로 복사
    var result = arr
    
    // 각 쿼리를 처리
    for query in queries {
        let i = query[0]
        let j = query[1]
        
        // arr[i]와 arr[j]의 값을 교환
        let temp = result[i]
        result[i] = result[j]
        result[j] = temp
    } 
    
    return result
}

5. 수열과 구간 쿼리 2

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k]꼴입니다.

 query마다 순서대로 s  i  e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.

각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.


제한사항

  • 1 ≤ arr의 길이 ≤ 1,000
    • 0 ≤ arr의 원소 ≤ 1,000,000
  • 1 ≤ queries의 길이 ≤ 1,000
    • 0 ≤ s  e < arr의 길이
    • 0 ≤ k ≤ 1,000,000

입출력 예

arr queries result
[0, 1, 2, 4, 3] [[0, 4, 2], [0 , 3, 2], [0, 2, 2]] [3, 4, -1]

입출력 예 설명

입출력 예 #1

  • 첫 번째 쿼리의 범위에는 0, 1, 2, 4, 3이 있으며 이 중 2보다 크면서 가장 작은 값은 3입니다.
  • 두 번째 쿼리의 범위에는 0, 1, 2, 4가 있으며 이 중 2보다 크면서 가장 작은 값은 4입니다.
  • 세 번째 쿼리의 범위에는 0, 1, 2가 있으며 여기에는 2보다 큰 값이 없습니다.
  • 따라서 [3, 4, -1]을 return 합니다.

제출 답안

import Foundation

func solution(_ arr: [Int], _ queries: [[Int]]) -> [Int] {
    var result: [Int] = []
    
    for query in queries {
        // 시작 인덱스 s
        // 끝 e
        // 기준 값 k
        let s = query[0], e = query[1], k = query[2]
        // k보다 크고 가장 작은 값 할당
        var minValue = Int.max
        
        // 최소값 찾기
        for i in s...e {
            // k보다 크면서 작은 값
            if arr[i] > k && arr[i] < minValue {
                // 최솟값 업데이트
                minValue = arr[i]
            }
        }
        // 최솟값이 없으면 -1
        result.append(minValue == Int.max ? -1 : minValue)
    }
    
    return result
}

반응형