용액의 특성값이 중복이 된다는 생각을 안하고 풀어서 1일이 걸렸다.


코드의 변화가 많이 있었는데

처음에는 순차적으로 검색하는걸 작성하다가 시간초과가 날 예상을 하고 안짰다.

다음에는 순차적으로 하는데 idx를 저장해서 그 idx만큼만 돌게했다. 시간초과

다음에는 l과 r을 두고 만나는 방식으로 했는데 틀렸다. 양수와 음수를 가지고 계산함.

다음에는 양수와 음수를 생각하지 않고 l과 r을 두고 만나는 방식을 사용함. (정답)

#include <cstdio>
/**
* https://www.acmicpc.net/problem/14921
* BOJ 백준온라인져지 14921 용액 합성하기 풀이
*/
using namespace std;
int abs(int a){
return a > 0 ? a : -a;
}
int min(int a, int b){
int aa = abs(a);
int bb = abs(b);
return aa < bb ? a : b;
}
int main(){
int N;
scanf("%d", &N);
int *list = new int[N];
for(int i = 0; i < N; i++){
scanf("%d", &list[i]);
}
int maximum = 1000000000, l = 0, r = N - 1;
do{
if(abs(maximum) > abs(list[l] + list[r])){
maximum = list[l] + list[r];
}
if(abs(list[l] + list[r]) >= abs(list[l] + list[r - 1])){
r--;
}else if(r + 1 < N && abs(list[l] + list[r]) > abs(list[l] + list[r + 1])){
r++;
}else{
l++;
}
}while(l < r);
printf("%d", maximum);
}
view raw BOJ_14921.cpp hosted with ❤ by GitHub


#include <cstdio>
/**
* https://www.acmicpc.net/problem/14921
* BOJ 백준온라인져지 14921 용액 합성하기 풀이
*/
using namespace std;
int abs(int a){
return a > 0 ? a : -a;
}
int min(int a, int b){
int aa = abs(a);
int bb = abs(b);
return aa < bb ? a : b;
}
int main(){
int N;
scanf("%d", &N);
int *list = new int[N];
for(int i = 0; i < N; i++){
scanf("%d", &list[i]);
}
int maximum = 1000000000, l = 0, r = N - 1;
do{
if(abs(maximum) > abs(list[l] + list[r])){
maximum = list[l] + list[r];
}
if(abs(list[l] + list[r]) >= abs(list[l] + list[r - 1])){
r--;
}else if(r + 1 < N && abs(list[l] + list[r]) > abs(list[l] + list[r + 1])){
r++;
}else{
l++;
}
}while(l < r);
printf("%d", maximum);
}
view raw BOJ_14921.cpp hosted with ❤ by GitHub

+ Recent posts