백준: Silver⑦ - 1213, 1235, 1244, 1302

2 분 소요


</br> 이제 실버 4에서 계속 풀이
</br>

1213: 팰린드롬 만들기

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

문자열 받으면 그거로 팰린드롬 만들기

    for(int i = 0; i < s.size(); i++){
        alphabets[s[i]-'A']++;
    }
    string ans = "";
    char mid = '1';
    for(int i = 0; i < 26; i++){
        ans.append(alphabets[i]/2, i+'A');
        if( alphabets[i] % 2 ){
            if( mid != '1' ){
                cout << "I'm Sorry Hansoo" << endl;
                return 0;
            }
            mid = i + 'A';
        }
    }
    string rev = ans;
    reverse(rev.begin(), rev.end());
    if( mid != '1' ) ans.append(1, mid);
    ans.append(rev);
    cout << ans << endl;

문자마다 몇 개 있는지 alphabets[]에 저장한다.
사전순으로 앞서야 하므로, ‘A’부터 검사한다.
만약 ‘A’가 2k개 있다면 좌우에 k개씩 있으면 되므로 k개 넣는다.
그런데 만약 ‘A’가 2k + 1개 있다면, 좌우로 두고 남은 하나는 반드시 단어의 가운데에 있어야 한다.
만약 가운데에 있어야 할 문자가 두 개 이상 나오면 팰린드롬을 만들지 못하므로 return 한다.
마지막에 반대쪽도 거꾸로 복붙해 주면 끝
</br>

1235: 학생 번호

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

최소한 자리수로 구별되게 하기

    for(int i = 1; i < v[0].size()+1; i++){
        set<string> s;
        for(int j = 0; j < n; j++){
            s.insert(v[j].substr(v[j].size()-i, v[j].size()));
        }
        if( s.size() == v.size() ){
            cout << i << endl;
            break;
        }
    }

set은 중복 요소를 없애 주니까, 그냥 set에다가 다 넣어주고 원래 사이즈와 같다면 구별된다는 뜻일 거다.
</br>

1244: 스위치 켜고 끄기

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

규칙에 따라 스위치 켜고 끄기

    for(int i = 0; i < m; i++){
        int a, b;
        cin >> a >> b;
        if( a == 1 ){
            for(int j = 1; j*b < n+1; j++){
                sw[j*b] = 1 - sw[j*b];
            }
        }
        else{
            sw[b] = 1 - sw[b];
            for(int j = 1; b+j < n+1 && b-j > 0; j++){
                if( sw[b+j] == sw[b-j] ){
                    sw[b+j] = 1 - sw[b+j];
                    sw[b-j] = 1 - sw[b-j];
                }
                else break;
            }
        }
    }

    for(int i = 1; i < n+1; i++){
        cout << sw[i] << ' ';
        if( i % 20 == 0 ) cout << endl;
    }
    cout << endl;

인덱스를 실수해서 얘만 한 방에 맞추기 실패했다…ㅜㅜ
심지어 출처 보니까 정보올림피아드 초등부 문제라는데…
아무튼 구현 자체는 그냥 하면 된다
</br>

1302: 베스트셀러

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

제일 많이 나온 제목 구하기

    for(int i = 0; i < n; i++){
        string s;
        cin >> s;
        if( m.count(s) ) m[s]++;
        else m.insert(pair<string, int>(s, 1));
    }
    string ans;
    int cnt = 0;
    for(auto it = m.begin(); it != m.end(); it++){
        if( it->second > cnt ){
            ans = it->first;
            cnt = it->second;
        }
        else if( it->second == cnt && ans > it->first ){
            ans = it->first;
        }
    }
    cout << ans << endl;

map에다가 나올 때마다 횟수 추가해서 구해주기
</br>


콤보가 깨졌다 아쉽구만
</br>

댓글남기기