[LV.1] 푸드 파이트 대회

Heedon Ham·2024년 5월 24일
0
post-thumbnail

수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.

이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 고려하지 않고 음식을 주문하여 몇 개의 음식은 대회에 사용하지 못하게 되었습니다.

수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.

제한사항

  • 2 ≤ food의 길이 ≤ 9
  • 1 ≤ food의 각 원소 ≤ 1,000
  • food에는 칼로리가 적은 순서대로 음식의 양이 담겨 있습니다.
  • food[i]는 i번 음식의 수입니다.
  • food[0]은 수웅이가 준비한 물의 양이며, 항상 1입니다.
  • 정답의 길이가 3 이상인 경우만 입력으로 주어집니다.

입출력 예

foodresult
[1, 3, 4, 6]"1223330333221"
[1, 7, 1, 2]"111303111"

3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.


binary한 한 쪽 구해서 복사하기

두 선수 공평하게 시작하기 위해 동일한 음식을 받는 것은 String에서 양 극단부터 가운데 위치까지 동일한 element를 가진다는 것을 의미한다.

음식 개수가 홀수인 경우, 나머지는 활용하지 못하므로, 각 선수가 얻을 수 있는 음식 개수는 food[i] / 2 로 구성할 수 있다.

따라서 한 쪽 선수의 문자열을 구한 뒤, 가운데 0 및 역순된 문자열을 구하면 될 것이다.

import Foundation

func solution(_ food:[Int]) -> String {
	var str = ""
    for i in 1..<food.count {
        str += String(repeating: String(i), count: food[i]/2)
    }
    return str + "0" + str.reversed()
}

참고: enumerated로 index 한번에 적용

import Foundation

func solution(_ food:[Int]) -> String {
	let str = food.enumerated().map { String(repeating: String($0.offset), count: $0.element/2) }.joined()
    return "\(str)0\(String(str.reversed()))"
}
profile
dev( iOS, React)

0개의 댓글