C++/대회기록, CP기록

AtCoder Beginner Contest 291 후기 (ABC 291 3솔)

fepick포트폴리오 2023. 2. 26. 22:57

이번 ABC는 친절하게도 에디토리얼이 있으니 개인적인 생각만 간단하게 남기겠다

 

왜 맨날 D번에서 막힐까?

 

A - camel Case

문자열을 입력받고,

문자열의 처음부터 끝까지 순서대로 탐색하면서 대문자가 나오는 순간 인덱스 + 1 을 출력하면 된다

 

개쉽네~ 생각하면서 풀다가 아스키코드를 헷갈려서 오답을 2번 제출했다

아스키코드표에서 A가 a 보다 먼저 온다

그러니까 영어 대문자를 찾으려면 'Z' 이하의 char 을 찾아야 함

 

B - Trimmed Mean

문제 제대로 안읽어서 2번 오답을 제출했다

설명이 필요한가??

5*N번 입력을 받은 다음 그것들을 sort 함수로 정렬한 다음

N번부터 ~ <4N번까지의 sum을 구한 뒤 3N으로 나눈 값을 출력하면 된다

fixed와 setprecision을 사용해서 원하는 소수점 자리까지 출력한다

 

C - LRUD Instructions 2

얘는 실수 안함

0,0에서 출발해서, 어떤 x,y좌표를 2번 이상 방문한 경우, Yes를 출력하면 된다.

한 번 방문한 x,y좌표를 기억하기 위해 set을 사용했다

 

 

D - Flip Cards

경우의 수를 따지는 문제인데 왜 못 품??

내가 확률과통계를 싫어해서 그런가?

 

실패한 코드

// WA code WA code WA code WA code WA code WA code WA code WA code 
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
#define ll long long

const int divnum = 998244353;

ll divconquer_mul(ll a,ll b){
    if(b==0)return 1;
    ll ans = 1;
    while (b)
    {
        if(b%2==1){
            ans*=a;
            ans%=divnum;
            b--;
        }
        b=b>>1;
        a*=a;
        a%=divnum;
    }
    return ans%divnum;
}


using namespace std;
int main(){
    fastio;
    int N;cin>>N;

    int a,b;cin>>a>>b;

    ll ans = 2;

    for (int i = 1; i < N; i++)
    {
        int x,y;cin>>x>>y;

        if(a==b&&x==y&&a==x){//불가능
            cout<<0;return 0;
        }
        else if(a!=b&&a!=x&&a!=y&&b!=x&&b!=y&&x!=y){//모두다름
            ans*=2;
            ans%=divnum;
        }
        else if(a==x&&b==y||a==y&&b==x){
            ;
        }
        else if(a==x||a==y||b==x||b==y){
            ans+=(ans/2);
            ans%=divnum;
        }
        a=x;b=y;
    }
    cout<<ans%divnum;
    return 0;
}
// WA code WA code WA code WA code WA code WA code WA code WA code

일일히 다양한 case를 if else if 로 따지려고 해서 못 푼 것 같다

분명 더 좋은 방법이 있을 것

분할정복을 이용한 거듭제곱 코드는 만들어놓고 쓰지도 않았다

 

복습을 열심히 하고 다음주엔 꼭 4~5솔을 노려보겠다