2022. 1. 29. 17:45ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/2864
접근 방법 - 자릿수 추출의 원리가 필요한 문제
백준의 2864번 문제는 어떠한 숫자에 대한 각 자릿수를 추출하는 원리 파악이 필요한 문제이다.
해당 문제에선 헷갈리는 숫자인 5와 6에 대해 얻을 수 있는 두 숫자의 합의 최댓값과 최솟값을 구하면 된다.
필자의 경우엔 최댓값을 구하기 위한 과정과 최솟값을 구하기 위한 과정을 나누어서 문제를 해결하였다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 두 숫자를 입력받는다.
2) cnt를 1로 초기화하며 선언한다. (자릿수 추출을 위한 변수로 설정하였다.)
3) 최댓값을 구하기 위한 반복문을 설정한다.
- 최대 자릿수가 10만이기 때문에 일의 자릿수에서 10만 자릿수까지 탐색하도록 설정한다.
- 추출한 자릿수가 5인 경우, 해당 자릿수를 6으로 바꾸어 연산하기 위해 해당 숫자에 cnt를 더한다.
(ex) 십의 자릿수가 5인 경우 50을 60으로 만들기 위해 10을 더한다.
- 반복문을 한번 실행할 때마다 cnt에 10을 곱한다.
4) 3)의 반복문이 실행 완료되면, 두 수를 더하여 max값을 구한다.
5) 최솟값을 구하기 위한 반복문을 설정한다.
- 최대 자릿수가 10만이기 때문에 일의 자릿수에서 10만 자릿수까지 탐색하도록 설정한다.
- 추출한 자릿수가 6인 경우, 해당 자릿수를 5로 바꾸어 연산하기 위해 해당 숫자에 cnt를 뺀다.
(ex) 천의 자릿수가 6인 경우, 6000을 5000으로 만들기 위해 1000을 뺀다.
- 반복문을 한번 실행할 때마다 cnt에 10을 나눈다.
6) 5)의 반복문이 실행 완료되면, 두 수를 더하여 min값을 구한다.
7) min과 max를 순차적으로 출력한 뒤 실행 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
//백준 2864번 코드
int main() {
int a, b;
scanf("%d %d", &a, &b);
int cnt = 1;
//최대값 구하기
for (int i = 0; i < 6; i++) {
if (a % (cnt * 10) / cnt==5) {
a += cnt;
}
if (b % (cnt * 10) / cnt == 5) {
b += cnt;
}
cnt *= 10;
}
int max = a + b;
//최소값 구하기
cnt = 1;
for (int i = 0; i < 6; i++) {
if (a % (cnt * 10) / cnt == 6) {
a -= cnt;
}
if (b % (cnt * 10) / cnt == 6) {
b -= cnt;
}
cnt *= 10;
}
int min = a + b;
printf("%d %d", min, max);
}
제출 결과
(2021.12.13 백준 2864번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 2884번 알람 시계 (C언어) (0) | 2022.01.30 |
---|---|
[백준 BOJ] 2869번 달팽이는 올라가고 싶다 (C언어) (0) | 2022.01.29 |
[백준 BOJ] 2798번 블랙잭 (Java) (0) | 2022.01.29 |
[백준 BOJ] 2775번 부녀회장이 될테야 (C언어) (0) | 2022.01.28 |
[백준 BOJ] 2753번 윤년 (C언어) (0) | 2022.01.28 |