#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <functional>
using namespace std;
typedef int integer;
int main()
{
string N;
cin >> N;
integer tempInt = 0;
for (const char & data : N)
{
tempInt += data - '0';
}
if (tempInt % 3 == 0)
{
sort(N.begin(), N.end(), greater<>());
if (N[N.length() - 1] == '0')
{
cout << N;
return 0;
}
}
cout << "-1";
return 0;
}
좀 오래 걸렸었는데 그만큼 배우는게 있었다
1. 일단 문제 파악을 처음에 잘못했다
들어오는 N이 100,000 이하 라고 처음에 이해를 해버려서 처음엔 Out of range가 났었다.
자리수가 100,000 이하 였던 것.. =_=
굉장히 큰 수이므로 정수로 해결하던 부분을 문자열로 해결하는 방식으로 변경했다.
2. 복잡한 방식 채택
그 후에는 시간 초과가 났었는데
그 이유는 불필요한 for문을 사용했었다.
30의 배수가 되려면 각 자리의 합이 3의 배수이고 마지막 자리가 0이면 순서가 어떻든지 가능한 조건이였다.
근데 나는 내림차순으로 정렬하여 prev_permutation 을 사용하면서 매번 3, 2, 5 로 나눈 값이 0인지 확인하였는데
이부분이 시간 초과의 범인이였다
3. 잘못알고 있었던 atoi
입력을 123을 한다면
처음엔 예상 값이 그대로
1
2
3
이 나올줄 알았는데
123
23
3
이 나온다..
주소를 받아 integer가 아닌 문자가 나올때까지 읽기때문에 이러한 값이 나왔다..
그래서 '0'을 빼주어 integer로 변환 시켜 주었다.
4. 새로 알게 된 사용법
생각해보면 string은 char의 집합이고 char또한 정수형이기 때문에 sort함수를 이용할수 있지 않을까 해서
실행해봤는데 잘 됐다
그리고 시간초과가 나와서 여러가지 보다가
cout의 endl이 개행문자 출력과 함께 출력버퍼를 비우는 역할을 하기에 시간을 좀 먹는다고 한다.
'\n'을 통해 개행을 해야겠다.
'코딩 테스트 > 알고리즘 풀이' 카테고리의 다른 글
[백준 - 1715] 카드 정렬하기 (0) | 2022.07.28 |
---|---|
[백준 - 2751] 수 정렬하기2 (0) | 2022.07.27 |
[백준 - 2217] 로프 (0) | 2022.07.23 |
[백준 - 1541] 잃어버린 괄호 (0) | 2022.07.23 |
[HackerRank] Time Conversion (0) | 2022.06.05 |