스위프트 코딩테스트 강좌, DDR을 해보자

안녕하세요, 여러분! 오늘은 스위프트로 구현하는 알고리즘 문제를 다뤄보겠습니다. 주제는 ‘DDR(Dance Dance Revolution)’ 게임에서 나타나는 알고리즘적 문제입니다. 이 문제는 여러분의 스위프트 프로그래밍 및 알고리즘 이해도를 높이는 데 매우 유용할 것입니다. 먼저 문제를 설명한 후, 함께 해결해봅시다.

문제 설명

문제는 다음과 같습니다:

문제: DDR 패턴 분석

DDR 게임에서는 플레이어가 화면에 나타나는 화살표를 발로 밟아서 점수를 획득합니다. 각 화살표는 1초 간격으로 나타나며, 이에 대한 패턴이 주어질 때, 주어진 시간 안에 몇 개의 화살표를 정확히 밟을 수 있는지를 계산하는 알고리즘을 작성하시오.

다음과 같은 정보를 입력받습니다:

  • n: 화살표의 총 개수 (1 ≤ n ≤ 1000)
  • t: 주어진 시간 (초, 1 ≤ t ≤ 100)
  • 패턴 배열: 각 화살표의 발동 시점이 나열된 배열 (각 아이템은 1 ≤ 아이템 ≤ t)

입력된 패턴을 기준으로 주어진 시간 내에 얼마나 많은 화살표를 밟을 수 있는지를 계산하여 출력하는 프로그램을 작성하시오.

예제 입력

5 3
1 2 3 4 5

예제 출력

3

문제 풀이 과정

이제 문제를 해결하기 위해 단계적으로 접근해 보겠습니다. 아래 과정을 따라가면서 풀이 방법을 이해해 보세요.

1단계: 입력 처리

우선, 입력으로 주어진 화살표의 개수, 제한 시간, 그리고 화살표의 발동 시점을 읽어와야 합니다. 입력 데이터는 일단 배열로 저장합니다. 예를 들어, 스위프트에서는 다음과 같이 할 수 있습니다:

import Foundation

// 입력 처리
let input = readLine()!.split(separator: " ").map { Int($0)! }
let n = input[0]  // 화살표의 총 개수
let t = input[1]  // 주어진 시간 (초)
let arrows = readLine()!.split(separator: " ").map { Int($0)! } // 화살표 발동 시점

2단계: 문제 이해

문제는 주어진 시간 ‘t’ 내에 몇 개의 화살표를 밟을 수 있는지를 알아내는 것입니다. 즉, 화살표 배치 배열에서 1부터 t 초까지의 화살표 수를 세면 됩니다.

3단계: 배열 정렬 및 유효성 검사

입력을 받은 후, 화살표 발동 시점 배열을 정렬해야 합니다. 왜냐하면 정렬된 상태에서 간단히 유효 시간을 기준으로 카운팅하기 수월하기 때문입니다.

let sortedArrows = arrows.sorted()

4단계: 카운트 로직 작성

이제 조건을 만족하는 화살표의 개수를 카운트하면 됩니다. 주어진 시간 ‘t’에 해당하는 화살표의 수가 몇 개인지 세는 방법은 매우 간단합니다. 배열을 순회하면서 각 화살표가 t보다 작거나 같을 때마다 카운트를 증가하면 됩니다.

var count = 0
for arrow in sortedArrows {
    if arrow <= t {
        count += 1
    } else {
        break // 더 이상 검사할 필요 없음
    }
}

5단계: 결과 출력

모든 화살표를 체크한 후 카운트를 console에 출력합니다.

print(count)

전체 코드

위의 모든 과정을 통합하면 아래와 같은 프로그램을 작성할 수 있습니다:

import Foundation

// 입력 처리
let input = readLine()!.split(separator: " ").map { Int($0)! }
let n = input[0]  // 화살표의 총 개수
let t = input[1]  // 주어진 시간 (초)
let arrows = readLine()!.split(separator: " ").map { Int($0)! } // 화살표 발동 시점

// 화살표 정렬
let sortedArrows = arrows.sorted()

// 카운트 변수
var count = 0
for arrow in sortedArrows {
    if arrow <= t {
        count += 1
    } else {
        break
    }
}

// 결과 출력
print(count)

결론

이상으로 스위프트를 이용한 DDR 화살표 카운팅 문제를 해결했습니다. 알고리즘 문제는 처음에는 어려울 수 있지만, 문제를 잘 정리하고 단계별로 접근하는 것이 중요합니다. 앞으로도 다양한 문제를 연습하고 스위프트 프로그래밍 능력을 키워보세요! 감사합니다!