https://www.acmicpc.net/problem/2153
문제
소수란 1과 자기 자신으로만 나누어 떨어지는 수를 말한다. 예를 들면 1, 2, 3, 5, 17, 101, 10007 등이 소수이다. 이 문제에서는 편의상 1도 소수로 하자.
알파벳 대소문자로 이루어진 영어 단어가 하나 있을 때, a를 1로, b를 2로, …, z를 26으로, A를 27로, …, Z를 52로 하여 그 합을 구한다. 예를 들어 cyworld는 합을 구하면 100이 되고, abcd는 10이 된다.
이와 같이 구한 수가 소수인 경우, 그 단어를 소수 단어라고 한다. 단어가 주어졌을 때, 그 단어가 소수 단어인지 판별하는 프로그램을 작성하시오.
입력
첫째 줄에 단어가 주어진다. 단어의 길이는 20자 이하이다. 주어지는 단어는 알파벳 소문자와 대문자만으로 이루어져 있다.
출력
아래의 예제와 같은 형식으로 출력을 한다. 소수 단어인 경우에는 It is a prime word. 를, 아닌 경우에는 It is not a prime word. 를 출력한다.
예제 입력 1 | 예제 출력 1 |
UFRN | It is a prime word. |
예제 입력 2 | 예제 출력 2 |
contest | It is not a prime word. |
풀이
1. 문자열을 입력받고 각 문자가 대문자인지, 소문자인지 판단한다.
(isupper, islower)
2. 문자가 대문자일 때, 아스키코드 값 A = 65 ~ Z = 90이고 A = 27이 나와야 하기 때문에 - 38을 해준다.
3. 문자가 소문자일 때, 아스키코드 값 a = 97 ~ z = 122이고 a = 1이 나와야 하기 때문에 - 96을 해준다.
4. 각 문자를 숫자로 변형하여 합을 구한 sum이 소수인지 아닌지 판단한다.
5. 이 문제에서는 1을 편의상 소수로 지정했기 때문에 sum==1이라는 조건을 작성한다.
6. 소수는 자기자신과 1로밖에 나눠지지 않기 때문에 for문을 1부터 sum까지 돌려 cnt가 2일 때만 "It is a prime word." 나오게 해 준다.
7. 그 외 나머지는 "It is not a prime word."로 나오게 해 준다.
코드
#include <iostream>
#include <string> // string
#include <cctype> // isupper, islower
using namespace std;
int main() {
string str;
cin>>str;
int b;
int sum=0;
// 풀이 1번
for(int i=0; i<str.length(); i++){
char c = str[i];
// 풀이 2번
if(isupper(c)){
b = int(c)-38;
}
// 풀이 3번
else if(islower(c)){
b = int(c)-96;
}
sum+=b;
}
int cnt=0;
// 풀이 4번
for(int j=1; j<=sum; j++){
if(sum%j==0){
cnt++;
}
}
if(cnt==2||sum==1){ // 풀이 5번
// 풀이 6번
cout<<"It is a prime word.";
}
//풀이 7번
else{
cout<<"It is not a prime word.";
}
return 0;
}
|
cs |
'백준 > C++' 카테고리의 다른 글
[BaeKJoon/C++] 백준 10384 c++ 팬그램 (2) | 2022.03.06 |
---|---|
[BaeKJoon/C++] 백준 2902 c++ KMP는 왜 KMP일까? (0) | 2022.03.05 |
[BaeKJoon/C++] 백준 1453 c++ 피시방 알바 (0) | 2022.03.04 |
[BaeKJoon/C++] 백준 1871 c++ 좋은 자동차 번호판 (0) | 2022.03.03 |
[BaeKJoon/C++] 백준 10988 c++ 팰린드롬인지 확인하기 (0) | 2022.03.02 |