백준: Silver⑪ - 1358, 1406, 1431, 1448

2 분 소요


</br> 계속 풀이
</br>

1358: 하키

https://www.acmicpc.net/problem/1358

하키 선수들이 몇 명 링크 안에 있는 지 세기

    int r = (double)h/2.0;
    int cnt = 0;
    for(int i = 0; i < p; i++){
        cin >> xs[i] >> ys[i];
        if( x <= xs[i] && xs[i] <= x+w
            && y <= ys[i] && ys[i] <= y+h ) cnt++;
        else if( dist(x,y+r, xs[i],ys[i]) <= r*r
            || dist(x+w,y+r, xs[i],ys[i]) <= r*r ) cnt++;
    }
    cout << cnt << endl;

링크가 네모 모양에 반원 두 개 붙인 모양이다.
그냥 네모 안에 있거나 반원 안에 있거나 하면 체크하면 된다
dist()는 내나 그 함수, (두 점 사이 거리)^2를 리턴하는 애로 만듦
</br>

1406: 에디터

https://www.acmcpc.net/problem/1406

에디터 구현하기

    list<char> l(s.begin(), s.end());
    int n;
    cin >> n;
    auto cursor = l.end();
    cin.ignore();
    while( n-- > 0 ){
        string s;
        getline(cin, s);
        if( s[0] == 'L' ){
            if( cursor != l.begin() ) cursor--;
        }
        else if( s[0] == 'D' ){
            if( cursor != l.end() ) cursor++;
        }
        else if( s[0] == 'B' ){
            if( cursor != l.begin() ){
                cursor--;
                cursor = l.erase(cursor);
            }
        }
        else if( s[0] == 'P' ){
            char c = s[2];
            l.insert(cursor, c);
        }
    }
    for(char c : l){
        cout << c;
    }
    cout << '\n';

시간 제한이 0.3초인 연결 리스트 문제다
이터레이터를 이동해서 커서처럼 쓴다.

그런데 이게 스택 풀이도 있다네…
생각도 못해서 풀이를 먼저 봐 버렸는데, 정리하면

  1. 스택 2개(커서의 왼쪽, 오른쪽)
  2. 처음 문자열을 전부 왼쪽 스택에 넣음(커서가 문자열 끝에 있으므로)
  3. L: 왼쪽 스택의 top을 오른쪽으로 push
  4. D: 오른쪽 스택의 top을 왼쪽으로 push
  5. B: 왼쪽 스택의 top을 pop
  6. P $: 왼쪽 스택에 $ push
  7. 출력은 왼쪽 스택에 거꾸로 쌓여 있으므로 왼쪽 스택을 전부 오른쪽 스택으로 옮긴 후 전체 출력

참신하다~~
</br>

1431: 시리얼 번호

https://www.acmcpc.net/problem/1431

시리얼 번호 조건에 맞게 정렬하기

bool cmp(string &s1, string &s2){
    if( s1.size() == s2.size() ){
        int c1 = 0, c2 = 0;
        for(int i = 0; i < s1.size(); i++){
            if( isdigit(s1[i]) ) c1 += s1[i] - '0';
        }
        for(int i = 0; i < s2.size(); i++){
            if( isdigit(s2[i]) ) c2 += s2[i] - '0';
        }
        if( c1 == c2 ) return s1 < s2;
        return c1 < c2;
    }
    return s1.size() < s2.size();
}

c++의 sort는 만능이에요
</br>

1448: 삼각형 만들기

https://www.acmicpc.net/problem/1448

삼각형의 최대 둘레 구하기

    sort(a, a+n, greater<>());
    int ans = -1;
    for(int i = 0; i < n-2; i++){
        if( a[i] < a[i+1] + a[i+2] ){
            ans = a[i] + a[i+1] + a[i+2];
            break;
        }
    }
    cout << ans << endl;

갑자기 짱 쉽다
내림차순으로 정렬해서 삼각형이 만들어지는 지 확인하면 끝
</br>


이번 4문제는 다 쉬운 것들이었다 이제 정답률 45.552%~~
이제 막 던져보는 습관 좀 자제해야지
그리고 갑자기 골드 4가 되었다
그래도 일단 다음엔 실버 2도 풀어봐야 겠음
</br>

댓글남기기