작성일 :

문제 링크

9056번 - Letter Bank

설명

두 단어가 같은 문자 집합으로 이루어져 있는지 판별하는 문제입니다.


접근법

두 번째 단어의 문자들을 집합에 저장합니다.

첫 번째 단어의 각 문자가 집합에 있는지 확인하고, 있으면 집합에서 제거합니다. 없으면 NO입니다.

모든 문자를 처리한 후 집합이 비어있으면 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
using System;
using System.Collections.Generic;
using System.Text;

class Program {
  static bool Solve(string a, string b) {
    var s = new HashSet<char>(b);
    foreach (var c in a) {
      if (!s.Contains(c))
        return false;
      s.Remove(c);
    }
    return s.Count == 0;
  }

  static void Main() {
    var parts = Console.In.ReadToEnd().Split((char[])null, StringSplitOptions.RemoveEmptyEntries);
    var idx = 0;
    var t = int.Parse(parts[idx++]);
    var sb = new StringBuilder();

    for (var tc = 0; tc < t; tc++) {
      var a = parts[idx++];
      var b = parts[idx++];
      sb.AppendLine(Solve(a, b) ? "YES" : "NO");
    }

    Console.Write(sb);
  }
}

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

typedef set<char> sc;

bool solve() {
  string a, b; cin >> a >> b;

  sc s(b.begin(), b.end());
  for (char c : a) {
    if (s.find(c) == s.end())
      return false;
    s.erase(c);
  }

  return s.empty();
}

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

  int t; cin >> t;
  while (t--)
    cout << (solve() ? "YES" : "NO") << "\n";

  return 0;
}