백준 10610. 30 [실패]

알고리즘/백준 알고리즘

2020. 8. 11. 11:49

1.실패 원인

개짓거리를 너무 했다.. 예전에 (저번 방학에) 기본 입출력과 이것 저것 푸는 문제에서 나온 유형이었는데.. 기억이 안나서 또다시 같은 실수로 삽질했다. 일단 출력을 찍어본 결과 제대로된 조합을 못만들어 냈다.. 심지어 꾸준함님 코드를 보고 그런 .. 조합을 만드는 과정조차 필요없단걸 깨달았다. 핵심은 30이 되는 조건을 구하는 것 + string으로 수를 받기였다. 예전에 각 자리수를 구하는 알고리즘을 계속 직접짜려했다가 string을 보고 신세계라고 생각했었는데.. 그걸 까먹었다. 거기서 시간을 날린것도 모잘라 가장 중요한 30이 되는 조건을 '%30 ==0' 따위의 짓을 했다는것 ㅠㅠㅠㅠ.. 이런 조건을 구하는 부분이 정수론에 포함되는 것 같다.

 

결국.. 30이되는 조건은 각자리의 수가 3의 배수이며 마지막 수가 0이어야 한다는 것... 따라서 모든 경우를 조합짜서 하는짓거리는 굉장히 미련한 짓이었다는 것 ㅜㅜㅜ.. 이건 외워야 하는가 .. 이제 블로그 포스팅 항목을 하나 더 늘려서 팁을 다 적어놔야겠다. 

 

2.작성 코드

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

 

//내림차순 정렬

bool cmp(char a, char b)

{

        if (a > b)

                 return true;

        return false;

}

 

int main(void)

{

        string N;

        cin >> N;

 

        long long sum = 0;

        bool zero = false;

        for (int i = 0; i < N.size(); i++)

        {

                 sum += (N[i] - '0');

                 if (!(N[i]-'0'))

                         zero = true;

        }

 

        //합이 3의 배수가 아니거나 0이 없다면

        if (sum % 3 || !zero)

                 cout << -1 << "\n";

        else

        {

                 sort(N.begin(), N.end(), cmp);

                 cout << N << "\n";

        }

        return 0;

}



출처: https://jaimemin.tistory.com/727 [꾸준함]

3.참고 코드

https://jaimemin.tistory.com/727

 

백준 10610번 30

문제 링크입니다: https://www.acmicpc.net/problem/10610 30의 배수이기 위해서는 다음의 조건을 충족해야합니다. 1. 끝의 자리수가 0이여야 합니다. 2. 각 자리의 수의 합이 3의 배수여야 합니다. 따라서 위

jaimemin.tistory.com

 

4. 해결 방안

아무래도 6개월 정도의 텀이 있었다 보니... 했던 유형들과 팁이 기억이 안났다. 블로그 포스팅에 알고리즘 팁들을 적어넣는 항목을 만들어야 할듯.