[알고리즘]

C++ 백준 22351번: 수학은 체육과목 입니다 3

danhan 2022. 6. 17. 16:38

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 문제 이상 푸는 걸 목표로 삼아야겠다.

단, 골드 한 문제 이상 풀기!!