Coding Test/Programmers

[Lv.1] 푸드 파이트 대회 [프로그래머스_코딩테스트] [구현] [20분]

whawoo 2025. 6. 4. 15:11
반응형

🔍 문제 요약

https://school.programmers.co.kr/learn/courses/30/lessons/134240

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

food라는 숫자 배열이 주어지고 0번 인덱스의 값은 무조건 1. 그 뒤로는 각 인덱스 번호의 음식 개수를 주어준다. 이 때 음식의 배열은 좌측과 우측에 동일한 개수가 낮은 숫자부터 차례대로 배치되어야 하고, 정중앙에는 0 (물)이 와야 한다. 이 때 최종 결과를 반환하기

🧠 나의 접근 방식과 시행착오

StringBuilder를 사용해서 문자열 수정에 대한 최적화를 고려했다. 다만 그 뒤로는 홀수이면 1개를 줄이고 양쪽에 정중앙 인덱스 기준으로 좌우로 Insert를 음식 개수 / 2를 해서 더해줬다. 시간은 약 20분 정도. 이해하는대로 그냥 바로 푼 문제라 그런지 깊이감이 있지는 못했던 듯 하다.

using System;
using System.Text;


public class Solution
{
    /// <summary>
    /// 푸드 파이트 대회
    /// https://school.programmers.co.kr/learn/courses/30/lessons/134240
    /// </summary>
    public string solution(int[] food)
    {
        // food의 0번은 물로 무조건 1
        // food의 1번부터 순서대로 개수 입력
        // 사실상 양방향에 추가되는거라 홀수는 -1시킴
        StringBuilder strBuilder = new StringBuilder();
        strBuilder.Append("0");

        for (int i = 1; i < food.Length; i++)
        {
            int amount = food[i];

            if (amount % 2 == 1)
            {
                amount -= 1;
            }
            
            int separateLen = amount / 2;

            if (separateLen == 0) continue;

            int zeroIndex = strBuilder.Length / 2;
            int leftIndex = zeroIndex;
            int rightIndex = zeroIndex + 1;

            strBuilder.Insert(leftIndex, i.ToString(), separateLen);
            strBuilder.Insert(rightIndex + separateLen, i.ToString(), separateLen);
        }
        
        string answer = strBuilder.ToString();
        return answer;
    }
}

/// <summary>
/// C# 7.3
/// </summary>
internal class Program
{
    public static void Main(string[] args)
    {
        var sl = new Solution();
        var food1 = new int[] { 1, 3, 4, 6 };
        var food2 = new int[] { 1, 7, 1, 2 };
        
        Console.WriteLine(sl.solution(food1));
        Console.WriteLine(sl.solution(food2));
    }
}

✅ 풀이 코드

최적화를 고려한 풀이 피드백을 하면 물이 배치되는 정중앙 인덱스에 숫자들을 반절 개수만큼 Append를 시키고. 우측은 좌측 배치의 거울처럼 배치가 되므로 Reverse를 활용해서 좌측 문자열 + 0 + 우측 문자열을 하면 된다. 어찌보면 정말 단순한 방법인데 Reverse라는 것도 자주 활용을 할 생각을 못했어서인지 놓친 방법이다. 아이디어가 좋은 느낌..

public string solution(int[] food)
{
    StringBuilder left = new StringBuilder();

    for (int i = 1; i < food.Length; i++)
    {
        int count = food[i] / 2;
        for (int j = 0; j < count; j++)
        {
            left.Append(i);
        }
    }

    // 오른쪽은 왼쪽을 뒤집은 것
    string right = new string(left.ToString().Reverse().ToArray());

    return left.ToString() + "0" + right;
}

🔄 정리

역시나 좀 더 깊게 생각을 한 번 더 해봤으면 하긴 하다. 좌우 대칭인 경우 Reverse를 떠올려라가 정리의 핵심이지 않을까 싶기도 하다.

반응형