[백준 BOJ] 2864번 5와 6의 차이 (C언어)

2022. 1. 29. 17:45PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/2864

 

2864번: 5와 6의 차이

첫째 줄에 두 정수 A와 B가 주어진다. (1 <= A,B <= 1,000,000)

www.acmicpc.net

백준 BOJ 2864번 5와 6의 차이 문제 사진

 

접근 방법 - 자릿수 추출의 원리가 필요한 문제

백준의 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);
}

 

제출 결과

백준 BOJ 2864번 5와 6의 차이 문제 C 제출 결과

(2021.12.13 백준 2864번 문제 제출 결과)

반응형