UCPC 2021 예선 문제 A
문제
[BOJ][C++] 백준 22351번: 수학은 체육과목 입니다 3
문제는 링크를 클릭해서 볼 수 있다.
풀이
핵심 풀이
첫 번째 정수 A부터 시작해서 하나씩 증가시키며 입력 문자열과 같은지 확인한다.
첫 번째 정수 A 구하기
A는 1 이상 999 이하의 정수이므로 한 자릿수, 두 자릿수 또는 세 자릿수이다.
먼저 A가 한 자릿수인 경우부터 구한다.
A가 한 자릿수이면 start_num은 input_string[0]이다.
이때 정답을 찾지 못했다면 A가 두 자릿수인 경우를 구한다.
이전에 구한 start_num에 입력 문자열의 두 번째 숫자 input_string[1]를 더한다.
두 번째 숫자를 더할 때 input_string[1]은 char 형이므로 int형에 그대로 더하게 되면 원하는 숫자가 아닌 아스키 값이 더해진다. 따라서 input_string[i]에서 ‘0’의 아스키 값을 빼 원하는 숫자를 구한다.
같은 방식으로 A가 세 자릿수 인 경우까지 구한다.
int start_num = 0; // 시작 정수
int range = min(3, (int)input_string.length()); // 시작 정수의 최대 자릿수
for (int i = 0; i < range; i++) {
start_num = start_num * 10 + input_string[i] - '0';
// 코드 생략
}
문자열 더하기
start_num부터 시작해 1씩 더해가며 빈 문자열에 숫자를 이어붙인다.
이어붙인 문자열과 입력 문자열이 동일하다면 시작 수와 마지막 수를 출력한 뒤 return; 한다.
만약 이어붙인 문자열의 길이가 입력 문자열보다 길어진다면 start_num 자체가 틀린 것이므로 break; 한다.
for (int next_num = start_num; ; next_num++) {
adding_string += to_string(next_num);
if (adding_string == input_string) {
cout << start_num << " " << next_num;
return 0;
}
if (adding_string.size() > input_string.size())
break;
}
공부
- int형 길이 구하는 방법, 자릿수 구하기
std::to_string(num).length();
#include<cmath>
int size = trunc(log10(num)) + 1;
- string형 데이터 int형으로 바꾸는 방법
#include <string>
int int_num = stoi(string_num);
- char형 데이터 int형으로 바꾸는 방법
// char_num의 아스키 값에서 '0'의 아스키 값을 뺴서 구한다.
int int_num = char_num - '0'
정답 코드
#include <iostream>
#include <string>
#include <algorithm>
#define FASTIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
int main() {
FASTIO
string input_string;
cin >> input_string;
int start_num = 0; // 시작 정수
int range = min(3, (int)input_string.length()); // 시작 정수의 최대 자릿수
for (int i = 0; i < range; i++) {
start_num = start_num * 10 + input_string[i] - '0';
string adding_string;
for (int next_num = start_num; ; next_num++) {
adding_string += to_string(next_num);
if (adding_string == input_string) {
cout << start_num << " " << next_num;
return 0;
}
if (adding_string.size() > input_string.size())
break;
}
}
return 0;
}
채점 결과
중얼중얼
실버5인데 푸는데 3시간 넘게 걸렸다.
시험공부 하느라 백준을 안 풀었더니 확실히 문제 푸는 감이 많이 떨어진 것 같다.
방학 동안 일주일에 3 문제 이상 푸는 걸 목표로 삼아야겠다.
단, 골드 한 문제 이상 풀기!!
'[알고리즘]' 카테고리의 다른 글
[JAVA] 문자열 처리, HashMap (0) | 2024.07.25 |
---|---|
[JAVA] 배열의 최대공약수 계산 (0) | 2024.07.23 |
백준 6604번: Matrix Chain Multiplication (0) | 2022.04.27 |
백준 1431번: 시리얼 번호 (0) | 2022.04.27 |
백준 1920번: 수 찾기 (0) | 2022.04.27 |