Machineboy空
1213 : 팰린드롬 - string.insert(), 홀짝 처리 본문
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";
}
'Computer > Coding Test' 카테고리의 다른 글
3986 : 좋은 단어 - 스택 (0) | 2024.02.05 |
---|---|
1629 : 곱셈 - 분할 정복, 재귀함수, pow (0) | 2024.02.02 |
9375 : 패션왕 신해빈 - 경우의 수 여집합 , Map 순회 (1) | 2024.02.02 |
1620 : 나는야 포켓몬 마스터 이다솜 - map, atoi() (0) | 2024.02.01 |
2559 : 수열 - 구간합, 슬라이딩 윈도우 (1) | 2024.01.31 |