minhui study

백준 10610번 30 (python, c++) 본문

백준 문제풀이/그리디 알고리즘

백준 10610번 30 (python, c++)

minhui 2020. 6. 1. 02:29

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

 

10610번: 30

문제 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶�

www.acmicpc.net

먼저 30배수의 조건을 알아보자 

30의 배수는 맨 끝자리가 0이여야 하고 자리수를 다 더하면 3의 배수여야 한다.

 

1) 0이 없으면 -1을 반환해야 한다.

2) 각 자리수를 다 더해서 3의 배수가 아니면 -1을 반환해야 한다.

 

그리고 만약 30의 배수의 조건을 다 성립한다면 즉, 0도 있고 각 자리수를 다 더해서 3의 배수라면 가장 큰 수를 구해야 하므로 가장 큰 숫자가 앞 자리에 오게끔 내림차순으로 정렬을 하면 가장 큰 30의 배수를 구할 수 있다.

 

<python>

n=input()
sum=0
if '0' not in n:
    print(-1)
else :
    for i in n:
        sum += int(i)
    if sum % 3 != 0 :
        print(-1)
    else :
        print(''.join(sorted(n,reverse=True)))

 

*sort와 sorted의 차이

- sort

 : 원본 리스트를 정렬하되 반환 값은 None이다.

 : 원본 리스트의 순서를 변경하고, 원본 리스트에 영향이 있다.

 : 리스트 형에 한해서만 동작한다.

 

 

- sorted

: 정렬된 새로운 리스트를 반환한다. ( 원본 리스트에 영향이 없다. )

: 모든 iterable에 동작한다. (list, turple, dict, 문자열 등 )

 

 

 

 

 

<C++>

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {

	string s;
	int sum = 0;
	cin >> s;
	
	if (s.find('0') == string::npos) {
		cout << -1;
	}
	else {
		for (int i = 0; i < s.size(); i++) {
			sum += s[i];
		}
		if (sum % 3 != 0) {
			cout << -1;
		}
		else {
			sort(s.begin(), s.end(), greater<int>());
			cout << s;
		}
	}
}
Comments