
1. idea
- 3으로 나누어 떨어지는 최소 수가 될 때까지 5로 나누기
- while(N%3!=0) 해서 계속 돌되, 우선 5랑 공배수인거 빼야되니까 N%5==0, 앞에서 거르고, 5보다 작을때 한번 걸러주면 5보다 크되, 5로 딱 나누어떨어지지는 않는 수를 가지고 와서 while을 돌면서 5를 먼저 최대한 많이 하고 나머지에 3을 넣어줄 수 있도록 함
2. 코드 전문
#include <iostream>
using namespace std;
int main(){
int N, cnt;
cin >> N;
if(N%5 == 0) cnt = N/5;
else if(N<5) cnt = N==3? 1 : -1;
else {
cnt = 0;
while(N%3 !=0){
N -= 5;
cnt++;
}
cnt += N/3;
}
cout << cnt << endl;
}
잉 왜 틀렸지
3. 수정해보기
아 66넣으면 14되어야되는데 22 나온다
아예 그럼 5로 꽉 채운다음에 남는거에서
3으로 안나눠떨어지면 계속 나눠질때까지 +5하고 cnt에서 --하고, 마지막에 N/3을 더하면 되지 않을까??
#include <iostream>
using namespace std;
int main(){
int N, cnt;
cin >> N;
if(N<5) cnt = N==3? 1 : -1;
else {
cnt = N/5;
N = N%5;
while(N%3!=0){
N += 5;
cnt--;
}
cnt += N/3;
}
cout << cnt << endl;
}
아까보다는 많이 맞긴 하는데 뭐가 문제일까?
예외상황 7!!! cnt가 음수가 될 수 있음
#include <iostream>
using namespace std;
int main(){
int N;
cin >> N;
int cnt = N/5;
int num = N%5;
while(cnt >=0 && num%3 != 0){
num +=5;
cnt--;
if(cnt == -1){
cout << -1 << endl;
return -1; // 이거를 return 0으로 하니까 된다
}
}
cnt += num/3;
cout << cnt << endl;
return 0;
}
이렇게 하면 런타임에러가 뜬다.....\
return -1; // 이부분을 return 0으로 하니까 된다
왜그런지 알아봤는데
return -1; 자체가 문법 오류는 아니지만,
문제에서 요구한 입출력 조건을 벗어나거나, 특정 플랫폼에서 오작동을 유발할 수 있어서 런타임 에러처럼 처리되는 것!
1. C++의 main 함수에서 return 값 의미
- main() 함수는 프로그램 종료 시 운영체제에 결과를 알려주는 역할을 함.
- return 0은 정상 종료를 의미.
- return -1은 비정상 종료로 해석가능
- 운영체제나 채점 시스템에 따라 에러 코드처럼 처리됨.
- 특히 백준 같은 온라인 채점 시스템에서는 return -1이 런타임 에러(RE)로 잡히기도 함.
| return 0; | 정상 종료 | ✅ 안전 |
| return -1; | 에러 종료 (OS에 따라) | ⚠️ 주의 (백준 등에서 RE 가능성) |
| cout << -1; | 출력으로 -1 사용 | ✅ 안전 (출력값만 요구할 때) |
- main() 함수에서는 출력값을 cout으로 내보내고,
종료는 항상 return 0;으로 해주는 것이 가장 안전하고 보편적인 방법 - return -1;은 테스트/디버깅용으로는 사용해도 되지만, 제출용 코드에서는 피하는게 좋을듯!
'C++ 문제풀기 > 백준-프로그래머스' 카테고리의 다른 글
| 프로그래머스 | 최댓값과 최솟값 (0) | 2025.09.13 |
|---|---|
| 프로그래머스 | [PCCP 기출문제] 1번 / 동영상 재생기 (0) | 2025.09.13 |
| 백준 | 2178. 미로 탐색 (0) | 2025.06.27 |
| 백준 | 1260. DFS와 BFS (0) | 2025.06.26 |
| 백준 | 10026. 적녹색약 (0) | 2025.06.25 |