낭만 IT

반응형

알고리즘

그리디, 백트래킹

힌트

매 시행마다 목표 채널과 현재 채널중 큰 것을 골라 빼거나 작은 것을 골라 더한다.

 

풀이

a와 b의 대소 관계가 고정되어 있지 않기 때문에 임의로 a>b로 잡아 주었다.

변경할 수 있는 수가 1, -1, 5, -5, 10, -10 인 것에 주목하자. (절대값이 같은 두 수가 3쌍이다.)

a에 10을 뺀 것은 b에 10을 더한 것으로 치환할 수 있다.

( 현재 온도를 x도 높인 것은 목표 온도를 x도 낮춘것 과 같고, 현재 온도를 x도 낮춘 것은 목표 온도를 x도 높인 것 과 같다. )

따라서 두 수 중 큰 수만 값을 줄여주면 되기 때문에

임의로 a와 b의 대소관계를 정해주는 것은 일반성을 잃지 않는다. 시행 횟수에 영향을 미치지 않는다.

d 배열에 양수 값만 필요하고 a, b 두 수의 차에 d[i]를 뺀 값의 절대값이 가장 크도록 하는 i를 찾은 뒤

a (두 수중 더 큰수)에 빼 d[i]를 빼주면 된다.

이 시행을 a와 b가 같아질 때 까지 반복한다.

#include<iostream>
#include<cmath>
using namespace std;

int main(){
    int d[3]={1,5,10};

    int a,b,cnt=0;
    cin>>a;
    cin>>b;

    while(a!=b){

        if(a<b){
            int tmp=a;
            a=b;
            b=tmp;
        }

        int result=a-b,index;
        for(int i=0;i<3;i++){
            if(abs(a-b-d[i])<result){
                result=abs(a-b-d[i]);
                index=i;
            }
        }
        a-=d[index];
        cnt++;        
    }        
    cout<<cnt;
}

반응형

'Problem Solve > Greedy' 카테고리의 다른 글

[백준] 8980번 택배 (C)  (2) 2020.03.07
[코드업] 4040 : 펜션 (C)  (0) 2020.03.07
[코드업] 3321 : 최고의 피자 (C)  (0) 2020.03.07
[코드업] 3301 : 거스름돈 (C)  (0) 2020.03.06
[코드업] 2001 : 최소 대금 (C)  (0) 2020.03.06

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band