https://www.acmicpc.net/problem/1871
문제
앨버타의 자동차 번호판은 ABC-0123 (세 글자, 네 숫자)와 같이 두 부분으로 나누어져 있다.
좋은 번호판은 첫 번째 부분의 가치와 두 번째 부분의 가치의 차이가 100을 넘지 않는 번호판이다.
글자로 이루어진 첫 번째 부분의 가치는 글자를 26진법 수처럼 계산한다. (각 자리가 [A.. Z]) 예를 들어, "ABC"의 가치는 28 (0 ×262+ 1 ×261+ 2 ×260)이 된다. "ABC-0123"은 |28 - 123| ≤ 100 이기 때문에, 좋은 번호판이다.
자동차 번호판이 주어졌을 때, 좋은 번호판인지 아닌지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 번호판의 수 N (1 ≤ N ≤ 100)이 주어진다. 다음 N개 줄에는 자동차 번호판이 LLL-DDDD 형식으로 주어진다.
출력
각각의 자동차 번호판에 대해서, 좋은 번호판이면 "nice"를, 아니면 "not nice"를 출력한다.
예제 입력 1 | 예제 출력 1 |
2 ABC-0123 AAA-9999 |
nice not nice |
풀이
1. 문자열을 입력받고 str.find() 함수를 이용해서 '-'의 문자 위치를 찾는다.
2. 문자의 위치를 찾았다면, substr() 함수를 이용해서 '-' 문자를 기준으로 문자열을 자른다.
ex) ABC-123 ==> 1. ABC 2. 123
3. 대문자 A의 아스키코드값은 65다. 근데 문제에서 A는 0, B는 1, C는 2로 계산하므로 -65를 해준다.
4. 그리고 abs() 함수를 이용해서 절댓값을 씌워준다.
5. 절댓값이 된 수가 100보다 작다면 'nice', 크다면 'not nice' 출력
코드
#include <iostream>
#include <string>
#include <algorithm> // find
#include <cmath> // abs(절댓값)
using namespace std;
int main() {
int test;
cin>>test;
for(int i=0; i<test; i++){
string str;
cin>>str;
// 문제 풀이 1번
int sever = str.find('-'); // 문자열에서 '-'를 찾으면
// 문제 풀이 2번
string str1 = (str.substr(0,sever)); // -를 기준으로 쪼갠다.
int bi = stoi(str.substr(sever+1));
int a, sum=0;
double b;
int len = str1.length();
for(int i=0; i<len; i++){
char c = str1[i];
// 문제 풀이 3번
a = int(c) - 65;
// if(c==소문자) -97
b = a * pow(26, len-i-1);
sum+=b;
}
// 문제 풀이 4번
int num = abs(sum-bi);
// 문제 풀이 5번
if(num<=100){
cout<<"nice\n";
}
else{
cout<<"not nice\n";
}
}
return 0;
}
// find, abs, pow, substr
|
cs |
이문제는 내장 함수를 많이 알고 있다면 충분히 쉽게 풀 수 있는 문제다.
'백준 > C++' 카테고리의 다른 글
[BaeKJoon/C++] 백준 2902 c++ KMP는 왜 KMP일까? (0) | 2022.03.05 |
---|---|
[BaeKJoon/C++] 백준 1453 c++ 피시방 알바 (0) | 2022.03.04 |
[BaeKJoon/C++] 백준 10988 c++ 팰린드롬인지 확인하기 (0) | 2022.03.02 |
[BaeKJoon/C++] 백준 4999 c++ 아! (0) | 2022.03.01 |
[BaeKJoon/C++] 백준 11170 c++ 0의 개수 (0) | 2022.02.28 |