백준 23847 INU 막대기

sirocube·2021년 12월 20일
0

BOJ

목록 보기
15/21

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

  • 그래프 이론, 애드 혹, 많은 조건 분기

  • 풀이
    각각 I, N, U을 그래프의 정점으로 생각하여 연결되어 있는지를 확인한다.
    다 연결되있다면 모든 값들의 합이 답이고 그 외는 간선들의 합을 비교하여 찾는다.

  • 코드

#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long

int N;
int ii=0,nn=0,uu=0;
int in=0, iu=0,nu=0;
int ctin=0, ctiu=0, ctnu=0;


int main(void){
    fast;
    cin>>N;
    for(int i=0;i<N;++i) {
        string s; int n;
        cin>>s>>n;
        if(s[0]==s[1]){
            if(s[0]=='I') ii+=n;
            else if(s[0]=='N') nn+=n;
            else uu+=n;
        }
        else{
            if((s[0]=='I' and s[1]=='N') or s[0]=='N' and s[1]=='I') {
                in+=n; ctin++;
            }
            if((s[0]=='I' and s[1]=='U') or s[0]=='U' and s[1]=='I') {
                iu+=n; ctiu++;
            }
            if((s[0]=='N' and s[1]=='U') or s[0]=='U' and s[1]=='N') {
                nu+=n; ctnu++;
            }
        }
    }
    if((ctin and ctiu and ctnu) or (ctin and ctiu and !ctnu) or (ctin and !ctiu and ctnu) or (!ctin and ctiu and ctnu)){
        cout<<ii+nn+uu+in+iu+nu; return 0;
    }

    if(ctin and !ctiu and !ctnu) {
        cout<<max(uu,ii+nn+in); return 0;
    }

    if(!ctin and ctiu and !ctnu) {
        cout<<max(nn,ii+uu+iu); return 0;
    }

    if(!ctin and !ctiu and ctnu) {
        cout<<max(ii,nn+uu+nu); return 0;
    }
    if(!ctin and !ctiu and !ctnu){
        cout<<max(ii,max(nn,uu)); return 0;
    }
}
profile
잉차차

0개의 댓글