[백준 2153] 소수 단어 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
주어진 영어 단어가 소수 단어인지 판별하는 문제입니다.
문자열의 각 알파벳을 숫자로 변환한 뒤, 그 숫자의 총합이 소수인지 판단하면 됩니다.
문제에서는 특별히 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."
중 하나를 출력합니다.
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;
}