수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.
이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 고려하지 않고 음식을 주문하여 몇 개의 음식은 대회에 사용하지 못하게 되었습니다.
예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.
수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.
food | result |
---|---|
[1, 3, 4, 6] | "1223330333221" |
[1, 7, 1, 2] | "111303111" |
using System;
using System.Linq;
public class Solution
{
public string solution(int[] food)
{
string answer = "";
string str = "";
for (int i = 1; i < food.Length; i++)
{
int num = food[i] / 2;
for (int j = 0; j < num; j++)
{
answer += i.ToString();
}
}
str = new string(answer.Reverse().ToArray());
answer += "0";
answer += str;
return answer;
}
}
문제 설명이 너무 구구절절이라서 설계하는 데에 시간이 조금 걸렸다. 하지만 매우 간단한 문제다.
int 자료형의 경우 2로 나눴을 때, 나머지는 버린 몫이 결과값이 된다는 점을 이용하면 쉽다.
(예: 3/2 = 1, 2/2 = 1)
Android build 최적화
Ios 빌드 알아보기
모닥불, 화로를 사용하기 위한 장작 시스템 추가하기
public class MakeFire : MonoBehaviour
{
//Player.System에 달아줄 컴포넌트 형식
//모닥불, 화로에 Interact 시 UIMakeFire를 ShowPopup 시킨다.
private UIMakeFire _makeFireUI;
public void OnMakeFireShowAndHide()
{
if (_makeFireUI == null)
{
_makeFireUI = Managers.UI.ShowPopupUI<UIMakeFire>();
return;
}
if (_makeFireUI.gameObject.activeSelf)
{
Managers.UI.ClosePopupUI(_makeFireUI);
}
else
{
Managers.UI.ShowPopupUI<UIMakeFire>();
}
}
}
public class UIMakeFire : UIPopup
{
//내부에 존재하는 각 버튼들을 알맞게 이벤트 바인딩을 해준다.
private enum GameObjects
{
Exit,
UIFunctionsUseFireSlot,
FirewoodItems
}
private GameObject _functionsUseFireSlotButton;
private Transform _firewoodItems;
[SerializeField] private GameObject _itemSlotPrefab;
[SerializeField] private ItemData[] _itemSlots = new ItemData[2];
public override void Initialize()
{
base.Initialize();
Bind<GameObject>(typeof(GameObjects));
Get<GameObject>((int)GameObjects.Exit).BindEvent((x) =>
{
Managers.UI.ClosePopupUI(this);
});
_functionsUseFireSlotButton = Get<GameObject>((int)GameObjects.UIFunctionsUseFireSlot);
_functionsUseFireSlotButton.BindEvent((x) => { OnCookingUIPopup(); });
}
private void Awake()
{
Initialize();
GetFirewoodItems();
_firewoodItems = Get<GameObject>((int)GameObjects.FirewoodItems).transform;
gameObject.SetActive(false);
}
private void Start()
{
SetIngredients();
}
private void SetIngredients()
{
foreach (var item in _itemSlots)
{
GameObject itemUI = Instantiate(_itemSlotPrefab, _firewoodItems);
Image itemIcon = itemUI.transform.Find("Icon").GetComponent<Image>();
TextMeshProUGUI itemQuantity = itemUI.GetComponentInChildren<TextMeshProUGUI>();
// 아이템 아이콘 설정
itemIcon.sprite = item.iconSprite;
itemQuantity.text = 0.ToString(); // _itemSlots에 있는 quantity를 가지고 와야하지 않나?
}
}
private void GetFirewoodItems()
{
var itemData = Managers.Resource.GetCache<ItemData>("BranchItemData.data");
_itemSlots[0] = itemData;
itemData = Managers.Resource.GetCache<ItemData>("LogItemData.data");
_itemSlots[1] = itemData;
}
private void OnCookingUIPopup()
{
Managers.Game.Player.Cooking.OnCookingShowAndHide();
}
}
[💡Feature] Create Firewood system
모닥불, 화로에 장작용 아이템을 넣어야 동작하는 시스템을 구현 중입니다.
확실히 기능 구현 전에 와이어프레임을 짜놓고 시작하니 순차적으로 진행된다는 느낌을 받았다. 고민하는 시간이 길었긴 하지만 코딩이 익숙해짐에 따라서 속도가 붙을 것으로 예상이 된다.