작성일 :

문제 링크

30822번 - UOSPC 세기

설명

문자열의 문자들을 재배열해 ‘uospc’를 최대 몇 번 만들 수 있는지 묻는 문제입니다. 각 패턴에 필요한 문자는 u, o, s, p, c가 하나씩입니다.


접근법

하나의 패턴을 만들려면 u, o, s, p, c가 각각 하나씩 필요합니다. 따라서 만들 수 있는 패턴의 최대 개수는 이 다섯 문자의 등장 횟수 중 가장 적은 값으로 결정됩니다.

문자열을 순회하며 각 문자의 빈도를 센 뒤, 다섯 문자의 빈도 중 최솟값을 출력하면 됩니다.


Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;

class Program {
  static void Main() {
    var n = int.Parse(Console.ReadLine()!);
    var s = Console.ReadLine()!;

    var cnt = new int[256];
    foreach (var ch in s)
      cnt[ch]++;

    var chars = new[] { 'u', 'o', 's', 'p', 'c' };
    var ans = int.MaxValue;
    foreach (var ch in chars)
      ans = Math.Min(ans, cnt[ch]);

    Console.WriteLine(ans);
  }
}

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
#include <bits/stdc++.h>
using namespace std;

typedef vector<int> vi;

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

  int n; cin >> n;
  string s; cin >> s;

  vi cnt(256, 0);
  for (char c : s)
    cnt[(unsigned char)c]++;

  string need = "uospc";
  int ans = INT_MAX;
  for (char c : need)
    ans = min(ans, cnt[(unsigned char)c]);

  cout << ans << "\n";

  return 0;
}