Machineboy空

1213 : 팰린드롬 - string.insert(), 홀짝 처리 본문

Computer/Coding Test

1213 : 팰린드롬 - string.insert(), 홀짝 처리

안녕도라 2024. 2. 2. 13:35

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

 

1213번: 팰린드롬 만들기

첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.

www.acmicpc.net

문제요약

문자열이 주어지면 팰린드롬으로 반환하도록

 

난이도

Silver 3


my 풀이

 

알파벳 순으로 카운트 후,

  • case 분류
    • 모든 알파벳의 개수가 짝수일 경우
    • 모든 알파벳의 개수가 모두 짝수는 아닐 경우
      • 짝수 여러개 + 홀수 하나 : 팰린드롬 가능
        • 홀수인 개수가 1인 경우
        • 홀수인 개수가 3이상의 홀수인 경우
      • 아니면 : 불가

이렇게 풀었는데 예외처리가 모두 되지 않은 것인지 오답

 

other 풀이

 

깔때기 느낌으로 예외를 먼저 걸러주는 방식으로 if 조건부 순서를 구성

  • 알파벳의 개수가 홀수일 경우
    • mid에 추가해주고, 홀수 개수 카운트 후
    • 알파벳 개수 --
  • 홀수 개수가 2이상이면 안되므로, break,
  • 여기까지 넘어온 것은 짝수 일 것.
    • 짝수에 한해 앞선 것을 빈 문자열에 더해주는 방식
  • 마지막에 중간 위치에 mid insert해주기.

REVIEW

 

난 경우의 수나, 케이스 처리를 할 때 체력으로 밀어붙이는 경우가 허다한 편..

늘 케이스를 나열하다보면 뭔가 잘못되어가고 있음을 느끼고 초월적 답에 대한 고민을 하게 되지만

일단 칼을 뽑아들었으므로 끝은 보려 했으나 보기 좋게 틀려버렸다.

 

100줄이상 쓴 코드가, 모범 답안에선 37줄으로 끝나버렸다. 허무하군.

 

map 자료구조 좀 더 공부하기. 문제 읽고 적절한 자료구조 고르는 노하우 익히기.

문자열 다루기에 능해지기!

 

자주 쓰는 메소드를 익히지 않으면 생각할 수 있는 코드 범위가 너무나 제한적이어짐.


문법정리

  • 비트연산자 AND(&), OR(|), XOR(^)
    • XOR(^)는 서로 다르면 1을 반환
0&0 0 0 | 0 0 0^0 0
0&1 0 0 | 1 1 0^1 1
1&0 0 1  | 0 1 1^0 1
1&1 1 1  | 1 1 1^1 0

 

int c;

if(c&1) //c 의 최하위 비트가 1인지 즉, 홀수인지 판별하는 로직
  • string.insert( )
//다른 문자열 삽입
myString.insert(index, otherString);

//일부 문자열 삽입
myString.insert(index, otherString, subIndex, subCount);

//문자 반복 삽입
myString.insert(index, count,character);
#include <iostream>
#include <string>

int main() {
    std::string myString = "Hello, World!";

    // 문자열의 특정 위치에 다른 문자열의 일부를 삽입
    std::string toInsert = "C++ Programming";
    myString.insert(7, toInsert, 0, 3); // "C++ "를 "Hello, " 다음에 삽입

    std::cout << myString << std::endl;  // 출력: Hello, C++ World!

    return 0;
}

CODE

#include <bits/stdc++.h>
using namespace std;

string s, ret;
int cnt[200], flag;
char mid;

int main(){

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> s;

    for (char a: s) cnt[a]++;

    for(int i = 'Z'; i >= 'A'; i--){
        if(cnt[i]){
            if(cnt[i]&1){   //홀수인지 체크
                mid = char(i); flag++;
                cnt[i]--;
            }

            if(flag == 2) break;

            for(int j = 0; j < cnt[i]; j+=2){
                ret = char(i) + ret;
                ret += char(i);
            }
        }
    }

    if(mid)ret.insert(ret.begin() + ret.size()/2,mid);
    
    if(flag==2) cout << "I'm Sorry Hansoo\n";
    else cout << ret << "\n";

}