celina의 이것저것
[C++] 백준 15873번 - 공백 없는 A+B 본문
문제
자연수 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
'자료구조&알고리즘 > 백준' 카테고리의 다른 글
[C++] 백준 10824번 - 네 수 (1) | 2023.01.23 |
---|---|
[C++] 백준 2965번 - 캥거루 세마리 (0) | 2023.01.23 |
[C++] 백준 5575번 - 타임 카드 (2) | 2023.01.23 |
[C++] 백준 3009번 - 네 번째 점 (1) | 2023.01.18 |
[C++] 백준 2566번 - 최댓값 (1) | 2023.01.18 |