2023. 6. 27. 00:14, 알고리즘/BOJ
정말 정말로 어이없게도
if
else if
else
형태로 작성해야 하는 코드를
if
if
if
if
형태로 급조해서 작성해놓고
지속적으로 중복되는 연산과정이 발생해서 왜 그런지에 대해서 파악하지 못하고 시간을 보내다가 겨우 파악하였다.
if
else if
else 형태의
코드로 작성하면,
각각의 경우에 해당하는 if 문, 혹은 else if 문, 혹은 else 문에서 연산을 끝낸뒤 다른 케이스들에 영향을 미치지 않는데,
만약에
if
if
if
if
형태처럼 쭉 if 문으로만 작성하면, 위에 작성한 if문에서의 변화가 다음 if문에 해당하는 경우로 case들을 바꾸어 버릴 수 있기 때문에,
이런식으로 작성하면 안된다.
이런걸 피하기 위해서는
if
else if
else if
else
형태로 코드를 작성하던지
아니면
if {
continue;
}
if {
continue;
}
if {
continue;
}
if {
continue;
}
형태처럼 코드를 작성해서 continue 문을 통해서 아래 코드들이 동작하지 않도록 넘어가야 한다.
그러니 그냥 애초부터
if
else if
else 형태로
코드를 작성하도록 하자.
if
else if
else if
else if
형태로 작성하는 것과,
if
if
if
if
형태로 작성하는건 아주아주 엄연히 다르다. 주의하도록 하자.
정말 어이없는 형태로 작성한 코드를 첨부해본다. 그래도 결국 통과는 했는데, 다음에는 이런식으로 작성하지 않도록 더 좋은 코드를 만들어내도록 하자.
#include <bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int>> plusPq;
// priority_queue<int, vector<int>,greater<int>> minusPq;
priority_queue<int> minusPq;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
int i=0;
while(n--){
int t;
cin>>t;
if(t==0){
if(plusPq.empty()&&!minusPq.empty()){
cout<<minusPq.top()<<"case 1: i is "<<i<<'\n';
minusPq.pop();
continue;
}
if(!plusPq.empty()&&minusPq.empty()){ /*여기서 continue를 빼면, 바로 case 3 인 경우도 같이 걸리네. */
cout<<plusPq.top()<<"case 2: i is "<<i<<'\n';
plusPq.pop();
continue;
}
if(plusPq.empty()&&minusPq.empty()){// 여기가 같이 문제야.
cout<<0<<"case 3: i is "<<i<<'\n';
continue;
}
if(!plusPq.empty()&&!minusPq.empty()){
if(plusPq.top()>=-minusPq.top()) {
cout<<minusPq.top()<<"case 4: i is "<<i<<'\n';
minusPq.pop();
continue;
}
else if(plusPq.top()<-minusPq.top()){
cout<<plusPq.top()<<"case 5: i is "<<i<<'\n';
plusPq.pop();
continue;
}
}
i++;
}
else if(t>0){
plusPq.push(t);
}
else{ // t<0
minusPq.push(t);
}
}
}
'알고리즘 > BOJ' 카테고리의 다른 글
Comments, Trackbacks