문제

영학이는 딸기우유, 초코우유, 바나나우유를 좋아한다.

입맛이 매우 까다로운 영학이는 자신만의 우유를 마시는 규칙이 있다.

  1. 맨 처음에는 딸기우유를 한 팩 마신다.
  2. 딸기우유를 한 팩 마신 후에는 초코우유를 한 팩 마신다.
  3. 초코우유를 한 팩 마신 후에는 바나나우유를 한 팩 마신다.
  4. 바나나우유를 한 팩 마신 후에는 딸기우유를 한 팩 마신다. 

영학이는 우유 축제가 열리고 있는 우유거리에 왔다. 우유 거리에는 우유 가게들이 일렬로 늘어서 있다.

영학이는 우유 거리의 시작부터 끝까지 걸으면서 우유를 사먹고자 한다.

각각의 우유 가게는 딸기, 초코, 바나나 중 한 종류의 우유만을 취급한다.

각각의 우유 가게 앞에서, 영학이는 우유를 사마시거나, 사마시지 않는다.

우유거리에는 사람이 많기 때문에 한 번 지나친 우유 가게에는 다시 갈 수 없다.

영학이가 마실 수 있는 우유의 최대 개수를 구하여라.

 

 

조건 및 입출력

- 첫째 줄에 우유 가게의 수 N이 주어진다. (1 ≤ N ≤ 1000) 둘째 줄에는 우유 가게 정보가 우유 거리의 시작부터 끝까지 순서대로 N개의 정수로 주어진다. 0은 딸기우유만을 파는 가게, 1은 초코우유만을 파는 가게, 2는 바나나우유만을 파는 가게를 뜻하며, 0, 1, 2 외의 정수는 주어지지 않는다.

- 영학이가 마실 수 있는 우유의 최대 개수를 출력하시오.

- 시간 제한: 1초 / 메모리 제한: 256MB

 

 

코드 (C99)
#include <stdio.h>

main()
{
	int test;
	scanf("%d", &test);

	int result = 0, drink = 0;

	for (int i = 0; i < test; i++)
	{
		int check;
		scanf("%d", &check);

		if (check == drink)
		{
			result++;
			drink++;
			drink %= 3;
		}
	}
	printf("%d", result);
	
	return 0;
}

 

 


여담

문제를 잘못 이해해서 조금 헤맸던 문제.

단순히 생각하면, 각각의 우유 가게에서 우유를 사먹는다 or 안 사먹는다는 옵션 밖에 없다.

그리고, 딸기-초코-바나나 순으로 사 먹어야 한다.

 

예를 들어 0번 째 가게에서 딸기우유를 사 먹었으면, 다음에 우유를 사 먹을 땐 무조건 초코 우유를 파는 가게에서 우유를 사 먹어야 한다는 것이다.

 

물론, 한 번 지나간 가게는 다시 돌아 올 수 없다.

 

이를 반영하여, 코드를 작성한다.

가게 정보를 입력받고, 내가 먹어야 하는 우유와 가게 정보가 일치하는지 확인한다.

일치하면 결과값에 반영해 준다. 그리고 다음 먹어야 하는 가게의 정보도 업데이트 한다.

딸기, 초코, 바나나 순으로 로테이션이 돌기 때문에 MOD 3 연산을 통해 계속해서 값이 3을 넘어가는 것을 방지한다.

 

그렇게 하여 총 사 먹을 수 있는 최대의 경우를 계산한다.

 

 

코드가 이상하거나, 이해되지 않는 부분이 있다면 댓글 남겨주세요!

+ 더 좋은 풀이 방법이 있다면 알려주세요 :)

+ Recent posts