celina의 이것저것

[C++] 백준 15873번 - 공백 없는 A+B 본문

자료구조&알고리즘/백준

[C++] 백준 15873번 - 공백 없는 A+B

celinayk 2023. 1. 23. 18:37
반응형

문제

자연수 A, B가 주어지면 A+B를 구하는 프로그램을 작성하시오.

입력

자연수 A, B (0 < A, B ≤ 10)가 첫 번째 줄에 주어진다. 단, 두 수의 사이에는 공백이 주어지지 않는다. 두 수의 앞에 불필요한 0이 붙는 경우는 없다.

출력

첫 번째 줄에 A+B의 값을 출력한다.

코드

#define _CRT_SECURE_NO_WARNINGS
#include <iostream> 
using namespace std;

int main() {
    int a, b,c;
    scanf("%d", &c);
    
    if (c < 100)
        printf("%d", c / 10 + c % 10);
    else if (c % 10 == 0)
        printf("%d", c / 100 + c % 100);
    else
        printf("%d", 10 + c % 10);
    return 0;
}

리뷰

 

int a, b,c;
    scanf("%d", &c);
    printf("%d", c / 10 + c % 10);

처음엔 이렇게 했다가 틀렸다. 당연함.

 

뭔가 예외의 경우가 있을거라고 생각해서 임의로 숫자들을 적어가면서 왜 이 코드가 틀렸는지 알아봤다.

 

37나누기 10은 몫 3 나머지 7

1010나누기 10은 몫 101 나머지 0 ㄴㄴ
1010나누기 100은 몫 10 나머지 10 정답 20

110나누니 10은 몫 11 나머지 0 ㄴㄴ
110나누기 100은 몫 1 나머지 10 정답 11

210나누기 10은 몫 몫 21 나머지 0 ㄴㄴ
210나누기 100은 몫 2 나머지 10 정답 12


102나누기 10은 몫10 나머지 2
101나누기 10은 몫 10 나머지 1 

 

이렇게 하나씩 적어봤다. 내가 처음작성한 저 코드가 틀린이유는 1010의 경우 내 코드로 작성하면 답이 20이 되어야하는데 101이 된다. 문제에서 두 수의 앞에 불필요한 0이 오면 안된다고 했는데 210이나 110, 1010의 경우의 B가 불필요한 0이 된다. 그래서  저 ㄴㄴ 라고 적은 부분이 내 코드의 반례이다. 

 

먼저 두자리수 미만의 경우 처음코드 그대로 해도 되니까 작성해준다

 

그리고 저 ㄴㄴ가 되는부분은 C를 10으로 나눴을 때 나머지가 0이 되는 경우이다

이 경우를 IF문을 작성해서 100으로 나눈 몫과 나머지의합이 답이 되도록 작성해준다

(다시 보니 B를 그냥 10으로 해도 되겠다 어차피 모든 나머지는 10이 되니까)

printf("%d", c / 100 + c % 100);

printf("%d", c / 100 + 10);

 

마지막으로 102, 101등의 경우이다 몫은 어차피 10일테니 10 + 10으로나눴을떄나머지를 더해준다

왜 그냥 몫이 어차피 10이냐? 201이 될수도 있지 않냐? 싶은데

문제를 잘보면 A와B둘다 0보다 크고 10이하의 숫자이다 그래서 어차피 201이런건 안됨 어차피 몫은10

 

학습

별거 아닌 개쉬운건줄 알았는데 여러가지 경우를 생각해야한다, 좀 머리를 굴려야했다...

 

출처

15873번: 공백 없는 A+B (acmicpc.net)

 

15873번: 공백 없는 A+B

자연수 A, B (0 < A, B ≤ 10)가 첫 번째 줄에 주어진다. 단, 두 수의 사이에는 공백이 주어지지 않는다. 두 수의 앞에 불필요한 0이 붙는 경우는 없다.

www.acmicpc.net

 

Comments