본문 바로가기

코드포스

[코드포스 Practice17] E. Day at the Beach

 

정렬 됐는지 안 됐는지 판단 하는 건 최소값이랑 최대값으로 확인할 수 있다. 

이 개념 응용해서 풀었다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
 
using namespace std;
using i64 = long long;
 
int main() {
    int n;
    scanf("%d", &n);
    vector<int> v(n+1);
    vector<int> s(n+1);
    
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &v[i]);
        s[i] = v[i];
    }
    sort(s.begin(), s.end());
    
    int group = 0;
    int start_idx = s[1];
    int min, max;
    
    for (int i = 1; i <= n; i++)
    {
        if (start_idx == s[i])
        {
            min = v[i];
            max = v[i];
        }
        if (min == start_idx && max == s[i])
        {
            group++;
            start_idx = s[i+1];
        }
        else
        {
            if (max < s[i])
            {
                max = s[i];
            }
            if (s[i] < min)
            {
                min = s[i];
            }
        }
    }
    cout << group;
    
    return 0;
}

 

음.. 하지만 틀렸다..

 

이 문제에서 틀렸는데 당연히 500개라 짤려서 돌리지는 못하고..

보니 두 번째에 큰 수가 있는 경우가 문제인 것 같다.

 

 

오 찾았다

원래라면 1이 나와야 할텐데 2가 나왔다

 


 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
 
using namespace std;
using i64 = long long;
 
int main() {
    int n;
    scanf("%d", &n);
    vector<int> v(n+1);
    vector<int> s(n+1);
    
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &v[i]);
        s[i] = v[i];
    }
    sort(s.begin(), s.end());
    
    for (int i = 1; i <= n; i++)
    {
        printf("%d ", s[i]);
    }
    printf("\n");
    
    int group = 0;
    int start_idx = s[1];
    bool is_start = true;
    int min, max;
    
    for (int i = 1; i <= n; i++)
    {
        if (is_start)
        {
            printf("%d\n", i);
            min = v[i];
            max = v[i];
            is_start = false;
        }
        // printf("i: %d, min %d, max : %d\n", i, min, max);
        
        if (max < v[i])
        {
            max = v[i];
        }
        if (v[i] < min)
        {
            min = v[i];
        }
            
        if (min == start_idx && max == s[i])
        {
            printf("== : %d\n", i);
            //printf("i: %d, min %d, max : %d\n\n", i, min, max);
            group++;
            start_idx = s[i+1];
            is_start = true;
        }
        //printf("i: %d, min %d, max : %d\n\n", i, min, max);
    }
    cout << group;
    
    return 0;
}

악 안되겠다

왜이리 뇌가 안 굴러가는지 모르겠다

내일 끝내야지

 


 

 

 

엇...

앗...

단순히 최소 최대 비교했는데 그러면 안되겠다.

로직부터 다시 생각해봐야 할듯

 

 


 

ㅋㅋㅋㅋ 아 제발 머리 좀 쓰자!

어제 머리 안 굴리면서 엘레레 거리며 풀다가 오늘 집중해서 20분 만에 풀었음..

현타온다 왜 뇌를 안 쓸까

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
 
using namespace std;
using i64 = long long;
 
int main() {
    int n;
    scanf("%d", &n);
    vector<pair<int, int>> v(n+1);

    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &v[i].first);
        v[i].second = i;
    }
    sort(v.begin(), v.end());
    
    int group = 0;
    int start_idx = 1;
    int max = v[1].second;
    bool find = false;
    
    for (int i = 1; i <= n; i++)
    {
        if (v[i].second == start_idx && !find)
                find = true;
        if (v[i].second > max)
                max = v[i].second;
        if (find && i == max)
        {
            group++;
            find = false;
            start_idx = i+1;
            max = v[i+1].second;
        }
    }
    cout << group;
    
    return 0;
}

 

이번 코포도 끝~~

D번 복붙해서 더럽게 짰으니 이건 북님 코드 함 보고 정리해봐야겠다.