이야
이거
두용액 문제 아녀??
왕년에 두 용액 문제 풀 때 피눈물 흘렸는데 이렇게 다시 보네.
그래서 두 용액 문제처럼 l이랑 r을 배열 끝을 가리키게 하고, 합과 비교해보면서 줄이고 싶으면 r을 늘리고 싶으면 l을 움직였다.
어제 본 깔쌈한 코드처럼 짜려 했는데 포인터가 양 끝에 있어가지구 그냥 내가 편한대로 짰다ㅋㅋ
바로 코드로 옮김
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;
int main() {
i64 m, n;
scanf("%lld %lld", &m, &n);
vector<i64> v(n);
m *= 10000000;
for(int i = 0; i < n; i++){
scanf("%lld", &v[i]);
}
sort(v.begin(), v.end());
int l = 0, r = n-1;
i64 sum = v[0]+v[r];
while(l != r-1){
if(sum > m){
sum -= v[r--];
sum += v[r];
}
else if(sum < m){
sum -= v[l++];
sum += v[l];
}
else
break;
}
if(sum == m)
printf("yes %lld %lld", v[l], v[r]);
else
printf("danger");
return 0;
}
테스트 케이스도 넣어서 확인해보고 코드 제출했는데 틀렸다. 왜지
로봇 프로젝트는 실패했습니다.
점심 먹고 다시 생각해봐야겠다. 아마 오버플로우 때문이지 않을까??? 아마???
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;
int main() {
i64 m, n;
while(scanf("%lld %lld", &m, &n) == 2){
vector<i64> v(n);
m *= 10000000;
for(int i = 0; i < n; i++){
scanf("%lld", &v[i]);
}
sort(v.begin(), v.end());
int l = 0, r = n-1;
i64 sum = v[0]+v[r];
while(l != r-1){
if(sum > m){
sum -= v[r--];
sum += v[r];
}
else if(sum < m){
sum -= v[l++];
sum += v[l];
}
else
break;
}
if(sum == m)
printf("yes %lld %lld\n", v[l], v[r]);
else
printf("danger\n");
}
return 0;
}
결국 검색했고 문제를 찾았다ㅋㅋㅋ
"입력은 여러 개의 테스트 케이스로 이루어져 있다" 아 이걸 놓쳤다. 입력 개수가 안 주어진 건 어찌하지 하다가 다른 사람 코드 참고했다. 허버버
음.. 하지만 이제는 런타임 에러...
아 이거 전의 에러랑 비슷한 것 같다. 범위 벗어나서 런타임 에러 뜬 듯 고쳐봐야지
잉 아닌데?? 중간으로 가는 거잖아 이건
아 이게 문제가
while(l != r-1) 이렇게 하면 n이 1일 때 무한루프에 빠진다. 게다가 조각이 하나이거나 0개이면 danger 해주는 것도 빠졌다. (아니 이런건 입력에서 제외시켜주지) 그래서 수정해서 코드 제출했는데 틀렸습니다..
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;
int main() {
i64 m, n;
while(scanf("%lld %lld", &m, &n) == 2){
vector<i64> v(n);
m *= 10000000;
for(int i = 0; i < n; i++){
scanf("%lld", &v[i]);
}
sort(v.begin(), v.end());
int l = 0, r = n-1;
if(n == 1 || n==0){
printf("danger\n");
continue;
}
i64 sum = v[0]+v[r];
while(l < r){
if(sum > m){
sum -= v[r--];
sum += v[r];
}
else if(sum < m){
sum -= v[l++];
sum += v[l];
}
else
break;
}
if(sum == m)
printf("yes %lld %lld\n", v[l], v[r]);
else
printf("danger\n");
}
return 0;
}
원본 소스인 두 용액이랑 비교할려고 두 용액 문제 다시 봤더니 sum에 더하고 뺴지 않고 l이랑 r만 값을 바꾼다. 그래서 나도 똑같이 바꿨더니 맞았다. 엥?? 좀 당황스러웠음 뭐가 문제였던 거지?? 하지만 맞으니 행복합니다 오예
다음에는 조건 l < r로 두고 포인터만 바꾸기... 기억해야겠다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;
int main() {
i64 m, n;
while(scanf("%lld %lld", &m, &n) == 2){
vector<i64> v(n);
m *= 10000000;
for(int i = 0; i < n; i++){
scanf("%lld", &v[i]);
}
sort(v.begin(), v.end());
if(n == 1 || n==0){
printf("danger\n");
continue;
}
int l = 0, r = n-1;
i64 sum;
while(l < r){
sum = v[l]+v[r];
if(sum > m){
r--;
}
else if(sum < m){
l++;
}
else
break;
}
if(sum == m)
printf("yes %lld %lld\n", v[l], v[r]);
else
printf("danger\n");
}
return 0;
}
성공한 로봇 프로젝트
으휴 힘들었고 다시는 보지말자
'백준' 카테고리의 다른 글
15650 N과 M (2) (0) | 2020.02.19 |
---|---|
15649 N과 M (1) (0) | 2020.02.19 |
1806 부분합 (0) | 2019.12.30 |
1644 소수의 연속합 (0) | 2019.12.30 |
2669 직사각형 네개의 합집합의 면적 구하기 (0) | 2019.12.29 |