작성일 :

문제 링크

2153번 - 소수 단어

설명

주어진 영어 단어가 소수 단어인지 판별하는 문제입니다.

문자열의 각 알파벳을 숫자로 변환한 뒤, 그 숫자의 총합이 소수인지 판단하면 됩니다.

문제에서는 특별히 1도 소수로 간주하므로, 1, 2, 3 등도 소수로 처리해야 함에 주의해야 합니다.

  • 소문자 'a'부터 'z'는 각각 1부터 26으로
  • 대문자 'A'부터 'Z'는 각각 27부터 52로 계산합니다.

예를 들어,

  • aBc는 \(1 + 28 + 3 = 32\)이므로, 소수가 아니며
  • UFRN은 \(47 + 6 + 44 + 40 = 137\)이므로 소수입니다.


접근법

  • 먼저 문자열을 순회하면서, 각 문자를 숫자로 환산해 모두 더합니다.
    • 소문자는 'a'를 기준으로 \(\text{문자값} -\text{'a'} + 1\)
    • 대문자는 'A'를 기준으로 \(\text{문자값} -\text{'A'} + 27\)
  • 다음으로, 그 총합이 소수인지 판별합니다.
    일반적인 소수 판별 조건 외에도 문제 요구에 따라 1도 소수로 인정해야 하므로:
    1에 대한 예외 처리를 먼저 해야 합니다.

  • 최종 출력은 조건에 따라
    "It is a prime word." 또는 "It is not a prime word."
    중 하나를 출력합니다.


참고 : 에라토스테네스의 체 (Sieve of Eratosthenes) - soo:bak


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
using System;
using System.Linq;

class Program {
  static void Main() {
    var s = Console.ReadLine();
    var sum = s.Sum(c =>
      char.IsUpper(c) ? c - 'A' + 27 : c - 'a' + 1);

    bool isPrime = IsPrime(sum);
    Console.WriteLine($"It is{(isPrime ? "" : " not")} a prime word.");
  }

  static bool IsPrime(int n) {
    if (n == 1) return true; // 이 문제에서는 1도 소수로 간주해야함
    if (n < 2) return false;
    for (int i = 2; i * i <= n; i++) {
      if (n % i == 0)
        return false;
    }
    return true;
  }
}

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

using namespace std;
typedef vector<int> vi;

bool isPrime(int n) {
  if (n == 1) return true; // Problem-specific constraint
  if (n < 2) return false;
  for (int i = 2; i * i <= n; i++) {
    if (n % i == 0)
      return false;
  }
  return true;
}

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

  string s; cin >> s;
  int t = 0;
  for (char c : s) t += isupper(c) ? c - 'A' + 27 : c - 'a' + 1;
  cout << "It is" << (isPrime(t) ? " " : " not ") << "a prime word.\n";

  return 0;
}