🔍 문제 요약
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를 떠올려라가 정리의 핵심이지 않을까 싶기도 하다.
'Coding Test > Programmers' 카테고리의 다른 글
[Lv.2] n^2 배열 자르기 [프로그래머스_코딩테스트] [구현, 인덱스 규칙 관찰] [30분] (0) | 2025.06.07 |
---|---|
[Lv.1] 약수의 개수와 덧셈 [프로그래머스_코딩테스트] [수학] [20분] (1) | 2025.06.04 |
[Lv.1] 콜라 문제 [프로그래머스_코딩테스트] [수학, 반복 계산] [25분] (0) | 2025.06.02 |
[Lv.1] 숫자 문자열과 영단어 [프로그래머스_코딩테스트] [문자열, 구현] [25분] (0) | 2025.06.02 |
[Lv.1] 두 개 뽑아서 더하기 [프로그래머스_코딩테스트] [Set, 정렬] [25분] (0) | 2025.05.31 |