프로그래머스 - 푸드 파이트 대회

Lee·2023년 4월 6일
0

알고리즘

목록 보기
10/34
post-thumbnail

문제 출처

문제 출처 : 푸드 파이트 대회

문제 이해하기

  • 음식을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로 다른 선수는 제일 오른쪽에 있는 음식부터 순서대로 먹는 방식, 이때 물은 중앙에 배치하며 물을 먼저 먹는 사람이 승리한다.

주요 조건 이해하기 ⭐️

  1. 공정성을 위해 두 선수가 먹는 음식의 종류와 양은 동일하고, 순서도 동일하다. 순서는 칼로리가 낮은 순으로 배치한다.

  2. 이미 food 배열안에 칼로리가 낮은 순서로 음식이 배치되어 있으며, food[0]에는 물이 배치되어 있고 항상 1이다.

주어진 입출력과 문제에 나와있는 규칙을 바탕으로 관찰을 해보면 2가지 정보가 나왔다.

  1. food[0]을 제외한 나머지 원소들을 2로 나눈 후 그 몫만큼 반복하여 좌에서 우로가는 방향을 완성시킨 후 물을 배치한다. 그 다음 동일한 방법으로 우에서 좌로가는 방향을 완성시킨다. (다중 for문)

  2. 1번과 거의 유사한 방법이지만, 좌에서 우로 가는 방향에 대한 배치를 완성시킨 후 그 결과 값에 물에 배치와 좌에서 우로 가는 방향을 reverse()하여 최종 결과를 완성시킨다.

이 2가지의 정보 중 1, 2번째 방법은 결국 문자열을 더해야하는 연산이 필요하기 때문에 StringBuilder 클래스를 사용해서 풀어야하고, StringBuilder의 내장 함수는 reverse()repeat() 함수를 사용해서 푸는 방법인 2번 방법을 이용해 풀 예정이다.

여기서 repeat 함수를 사용하게 되는데, 이는 아래의 소스와 동일한 기능을 하게 된다.

		for (int i = 1; i < food.length; i++) {
			for (int j = 0; j < food[i] / 2; j++) {
				sb.append(i);
			}
		}

최종 소스 파일

class Solution {
    public String solution(int[] food) {
        StringBuilder sb = new StringBuilder();

		for (int i = 1; i < food.length; i++) {
			sb.append(String.valueOf(i).repeat(food[i] / 2));	
		}
		
		return sb.toString() + "0" + sb.reverse().toString();
    }
}

0개의 댓글