본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 2864 5와 6의 차이

by 까망 하르방 2022. 1. 23.
반응형

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));
		
		
	}
}
반응형

댓글