반응형
Approach
출처: https://www.acmicpc.net/problem/2864
주어지는 숫자에서 5와 6이 서로 변경될 수 있을 때
나올 수 있는 최소 합과 최대 합을 구하는 문제이다.
경우의 수는 5 or 6 으로 2가지이지만
합이 최소가 되는 경우는 6 → 5 가 되어야 한다.
합이 최대가 되는 경우는 5 → 6 이 되어야 한다.
예를들어 16796 와 58786 가 주어졌을 때,
최소합을 구하는 경우는 15795 + 58785 = 74580
C++
#include <iostream>
using namespace std;
int A, B;
int copyVal, ret;
int multiplier, tmp;
int func(int num, int from, int to)
{
ret = 0;
copyVal = num;
multiplier = 1;
// 각 자릿수 연산을 끝날 때 까지.
while (copyVal)
{
int tmp = copyVal % 10;
// from 값을 to 로
if (tmp == from)
tmp = to;
ret += (tmp * multiplier);
multiplier *= 10;
copyVal /= 10;
}
return ret;
}
int main()
{
// freopen("input.txt", "r", stdin);
scanf("%d %d", &A, &B);
// 최소 합, 최대 합
printf("%d %d\n", func(A, 6, 5) + func(B, 6, 5), func(A, 5, 6) + func(B, 5, 6));
}
Java
import java.util.Scanner;
public class Main {
public static int fiveTosix(int num, int r){
int result = num % 10;
if(result == 5){
result = 6;
}
if(num / 10 == 0){
return (int) (result*(Math.pow(10, r)));
}
return (int) (result*(Math.pow(10, r)) + fiveTosix(num/10, r+1));
}
public static int sixTofive(int num, int r){
int result = num % 10;
if(result == 6){
result = 5;
}
if(num / 10 == 0){
return (int) (result*(Math.pow(10, r)));
}
return (int) (result*(Math.pow(10, r)) + sixTofive(num/10, r+1));
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
System.out.print(sixTofive(num1, 0)+sixTofive(num2, 0)+ " ");
System.out.println(fiveTosix(num1, 0)+fiveTosix(num2, 0));
}
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 2902 KMP는 왜 KMP일까? (0) | 2022.02.12 |
---|---|
[BOJ] 백준 2864 5와 6의 차이 (0) | 2022.01.23 |
[BOJ] 백준 2839 설탕배달 (0) | 2022.01.21 |
[BOJ] 백준 2789 유학금지 (0) | 2022.01.20 |
[BOJ] 백준 2775 부녀회장이 될테야 (0) | 2022.01.17 |
댓글