안녕하세요, 오늘은 스위프트 코딩테스트에서 자주 나오는 알고리즘 문제 중 하나인 “선물 전달하기”에 대해 알아보겠습니다. 이 문제는 면접이나 코딩 테스트에서 매우 빈번하게 등장하며, 알고리즘적 사고를 기르는 데 도움이 됩니다.
문제 설명
당신과 친구들이 생일 파티를 열기로 하였습니다. 모든 친구들이 서로에게 선물을 주고받고 싶어합니다. 그러나, 한 친구에게는 자기 자신에게 선물을 주는 것을 허용하지 않기로 하였습니다. 각 친구들은 특정한 친구에게 선물을 주기로 약속했습니다. 다음은 총 N
명의 친구들이 있고, 그들이 주기로 한 선물의 목록이 주어졌을 때, 각 친구가 받을 선물을 출력하는 프로그램을 작성하시오.
입력 형식
- 첫 번째 줄에는 친구의 수
N
(1 ≤N
≤ 100)이 주어진다. - 두 번째 줄에는 각 친구가 선물을 주기로 한 친구의 인덱스가 주어진다. (친구는 1부터
N
까지 번호를 가진다)
출력 형식
각 친구가 받을 선물의 친구 번호를 한 줄에 하나씩 출력한다.
예제 입력
5 2 3 4 5 1
예제 출력
1 2 3 4 5
문제 풀이 과정
1단계: 문제 이해하기
먼저, 우리는 문제를 이해해야 합니다. 주어진 입력에서 각 친구가 누구에게 선물을 줄 것인지 알 수 있습니다. 각 친구는 자신에게서 선물을 받을 친구의 인덱스를 알아야 합니다. 따라서 출력할 결과는 각 친구가 주기로 한 인덱스를 기반으로 한 배열로 생각할 수 있습니다.
2단계: 데이터 구조 설계
우리는 입력값을 저장할 배열과, 각 친구가 받고 싶은 선물의 배열을 준비합니다. 친구 번호는 1부터 시작하므로, 배열은 크기 N + 1
로 선언하는 것이 편리합니다.
3단계: 문제 해결 알고리즘 설계
알고리즘은 다음과 같습니다:
- 입력을 받아서, 크기가
N + 1
인gift
배열을 선언합니다. - 입력된 선물 상자를
gift
배열에 저장합니다. - 앱에서 각 친구의 인덱스에 해당하는 선물을 출력합니다.
4단계: 스위프트 구현
이제 스위프트를 사용하여 알고리즘을 구현해 보겠습니다:
import Foundation // 친구 수 입력 let N = Int(readLine()!)! // 선물 전달 배열 var gift = Array(repeating: 0, count: N + 1) // 선물 디스트리뷰션 입력 let gifts = readLine()!.split(separator: " ").map { Int($0)! } // 배열에 팩킹 for i in 0..5단계: 코드 설명
코드를 간단히 설명하자면:
- 우선
N
이라는 친구 수를 입력받습니다.gift
라는 배열을 선언하고, 크기를N + 1
로 합니다. (배열 인덱스는 1부터 시작하기 때문)- 그리고 두 번째 입력을 통해 선물을 주기로 한 친구의 인덱스를
gifts
배열로 받습니다.- 반복문을 통해 각 친구가 받을 선물을
gift
배열에 저장합니다. 인덱스i
를 이용해 해당 친구의 인덱스에 저장합니다.- 모든 과정을 마친 뒤, 친구들이 받을 선물을 출력합니다.
결론
이 문제는 대부분의 코딩 테스트에서 주어지는 기본적인 배열 문제입니다. 문제를 이해하고, 적절한 데이터 구조와 알고리즘을 통해 쉽게 해결할 수 있습니다. 이처럼 알고리즘 문제를 다양한 접근법으로 풀어 나가면 실력을 향상시키는 데 많은 도움이 됩니다. 모두들 이 과정을 통해 스위프트가 더 친숙해지기를 바랍니다!