작성일 :

문제 링크

32751번 - 햄버거

설명

문자열의 순서와 제약 조건에 따라, 만들고자 하는 햄버거가 유효한지를 판단하는 문제입니다.

주어지는 문자열은 햄버거를 구성한 재료들의 순서를 의미하며,

가장 왼쪽 문자가 햄버거의 가장 아래쪽 재료, 가장 오른쪽 문자가 가장 위쪽 재료를 나타냅니다.

재료는 총 네 가지가 존재하며 다음과 같이 주어집니다:

  • a: 빵
  • b: 패티
  • c: 양상추
  • d: 토마토

햄버거가 유효하려면 아래의 조건을 모두 만족해야 합니다:

  • 햄버거의 가장 아래와 가장 위에 위치한 재료는 반드시 a여야 합니다.
  • 위에서 아래로 쌓인 재료들은 인접한 위치에 같은 종류가 두 번 연속으로 등장해서는 안 됩니다.
  • 사용된 각 재료의 개수는 각각 주어진 재고 수량 A, B, C, D를 초과할 수 없습니다.

이러한 조건을 하나라도 위반할 경우 "No"를 출력하며, 모든 조건을 만족하면 "Yes"를 출력합니다.


접근법

햄버거 문자열이 유효한지 판단하기 위해 다음과 같은 흐름으로 확인을 진행합니다.

먼저, 문자열의 가장 아래와 위에 위치하는 재료는 반드시 빵(a)이어야 하므로,

문자열의 시작과 끝이 모두 'a'인지 확인합니다.

만약 하나라도 빵이 아니라면, 유효한 햄버거가 될 수 없습니다.


다음으로, 재료들이 위에서 아래로 겹치지 않고 번갈아가며 쌓였는지 확인합니다.

이 조건은 문자열을 앞에서부터 순회하면서 인접한 두 문자가 같은 경우가 존재하는지의 여부로 판단할 수 있습니다.


마지막으로, 주어진 재료의 개수 제한을 초과하지 않았는지 확인합니다.

문자열을 순회하며 a, b, c, d 각각의 문자가 몇 번 등장하는지 세고,

입력으로 주어진 A, B, C, D보다 등장 횟수가 많다면 사용할 수 없는 햄버거가 됩니다.


이 세 가지 조건을 모두 만족하는 경우에만 유효한 햄버거라고 판단하여 "Yes"를 출력하며,

그 외의 경우에는 "No" 를 출력합니다.


Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;

class Program {
  static void Main() {
    int n = int.Parse(Console.ReadLine());
    var tokens = Console.ReadLine().Split();
    int a = int.Parse(tokens[0]);
    int b = int.Parse(tokens[1]);
    int c = int.Parse(tokens[2]);
    int d = int.Parse(tokens[3]);
    string s = Console.ReadLine();

    if (s[0] != 'a' || s[n - 1] != 'a') {
      Console.WriteLine("No");
      return;
    }

    for (int i = 1; i < n; i++) {
      if (s[i] == s[i - 1]) {
        Console.WriteLine("No");
        return;
      }
    }

    var cnt = new int[4];
    foreach (char ch in s)
      cnt[ch - 'a']++;

    if (cnt[0] <= a && cnt[1] <= b && cnt[2] <= c && cnt[3] <= d)
      Console.WriteLine("Yes");
    else
      Console.WriteLine("No");
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n, a, b, c, d;
  string s;
  cin >> n >> a >> b >> c >> d >> s;

  if (s[0] != 'a' || s[n-1] != 'a') {
    cout << "No\n";
    return 0;
  }

  for (int i = 1; i < n; i++) {
    if (s[i] == s[i-1]) {
      cout << "No\n";
      return 0;
    }
  }

  int cnt[4] = {0, };
  for (char ch : s)
    cnt[ch - 'a']++;

  cout << (cnt[0] <= a && cnt[1] <= b && cnt[2] <= c && cnt[3] <= d ? "Yes\n" : "No\n");

  return 0;
}