프로그래머스 입문문제

[프로그래머스 입문문제] Day 25 시뮬레이션, 조건문, 수학

Devleoper_yh 2025. 2. 19. 00:26
반응형

1. 문자열 밀기

문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 0 < A의 길이 = B의 길이 < 100
  • A, B는 알파벳 소문자로 이루어져 있습니다.

입출력 예

A B result
"hello" "ohell" 1
"apple" "elppa" -1
"atat" "tata" 1
"abc" "abc" 0

입출력 예 설명

입출력 예 #1

  • "hello"를 오른쪽으로 한 칸 밀면 "ohell"가 됩니다.

입출력 예 #2

  • "apple"은 몇 번을 밀어도 "elppa"가 될 수 없습니다.

입출력 예 #3

  • "atat"는 오른쪽으로 한 칸, 세 칸을 밀면 "tata"가 되므로 최소 횟수인 1을 반환합니다.

입출력 예 #4

  • "abc"는 밀지 않아도 "abc"이므로 0을 반환합니다.

제출 답안

import Foundation

func solution(_ A: String, _ B: String) -> Int {
    // A와 B의 길이가 다르면 밀어서 같아질 수 없으므로 -1 반환
    guard A.count == B.count else { return -1 }
    
    var rotatedA = A // 문자열 A를 복사하여 회전할 변수
    
    for count in 0..<A.count {
        // 현재 회전된 문자열이 B와 같다면 회전 횟수 반환
        if rotatedA == B {
            return count
        }
        
        // 문자열의 마지막 문자를 제거하여 맨 앞에 추가 (오른쪽으로 한 칸 밀기)
        let lastChar = rotatedA.removeLast()
        rotatedA = String(lastChar) + rotatedA
    }
    
    // A를 아무리 밀어도 B가 될 수 없다면 -1 반환
    return -1
}

 

https://developer.apple.com/documentation/swift/array/removelast()

 

removeLast() | Apple Developer Documentation

Removes and returns the last element of the collection.

developer.apple.com


2. 종이 자르기

머쓱이는 큰 종이를 1 x 1 크기로 자르려고 합니다. 예를 들어 2 x 2 크기의 종이를 1 x 1 크기로 자르려면 최소 가위질 세 번이 필요합니다.

정수 M, N이 매개변수로 주어질 때, M x N 크기의 종이를 최소로 가위질 해야하는 횟수를 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 0 < M, N < 100
  • 종이를 겹쳐서 자를 수 없습니다.

입출력 예

M N result
2 2 3
2 5 9
1 1 0

입출력 예 설명

입출력 예 #1

  • 본문과 동일합니다.

입출력 예 #2

  • 가로 2 세로 5인 종이는 가로로 1번 세로로 8번 총 가위질 9번이 필요합니다.

입출력 예 #3

  • 이미 1 * 1 크기이므로 0을 return 합니다.

제출 답안

import Foundation

func solution(_ M:Int, _ N:Int) -> Int {
    return (M * N) - 1
}

3. 연속된 수의 합

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.


제한사항

  • 1 ≤ num ≤ 100
  • 0 ≤ total ≤ 1000
  • num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

입출력 예

num total result
3 12 [3, 4, 5]
5 15 [1, 2, 3, 4, 5]
4 14 [2, 3, 4, 5]
5 5 [-1, 0 , 1, 2, 3]

입출력 예 설명

입출력 예 #1

  • num = 3, total = 12인 경우 [3, 4, 5]를 return합니다.

입출력 예 #2

  • num = 5, total = 15인 경우 [1, 2, 3, 4, 5]를 return합니다.

입출력 예 #3

  • 4개의 연속된 수를 더해 14가 되는 경우는 2, 3, 4, 5입니다.

제출 답안

import Foundation

func solution(_ num: Int, _ total: Int) -> [Int] {
    // 연속된 수의 평균 값을 구함
    let start = (total - num * (num - 1) / 2) / num
    var result = [Int]()
    
    // 시작값부터 num개 만큼의 연속된 수를 생성
    for i in 0..<num {
        result.append(start + i)
    }
    
    return result
}

4. 다음에 올 숫자

등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 2 < common의 길이 < 1,000
  • -1,000 < common의 원소 < 2,000
    • common의 원소는 모두 정수입니다.
  • 등차수열 혹은 등비수열이 아닌 경우는 없습니다.
  • 등비수열인 경우 공비는 0이 아닌 정수입니다.

입출력 예

common result
[1, 2, 3, 4] 5
[2, 4, 8] 16

입출력 예 설명

입출력 예 #1

  • [1, 2, 3, 4]는 공차가 1인 등차수열이므로 다음에 올 수는 5이다.

입출력 예 #2

  • [2, 4, 8]은 공비가 2인 등비수열이므로 다음에 올 수는 16이다

제출 답안

import Foundation

func solution(_ common: [Int]) -> Int {
    // 두 번째 원소와 첫 번째 원소의 차이를 계산해 등차수열인지 확인
    if common[1] - common[0] == common[2] - common[1] {
        // 등차수열이면 공차를 더해 마지막 원소 계산
        let difference = common[1] - common[0]
        return common.last! + difference
    } else {
        // 등비수열이면 공비를 곱하여 마지막 원소 계산
        let ratio = common[1] / common[0]
        return common.last! * ratio
    }
}

Day 25 - 입문문제 완료

반응형