아스키 코드 범위 이상(127개 이상)의 배열 cnt[200] 을 만들고 입력한 문자열 s를 돌며 각 문자를 반복자가
가리킬때마다 cnt[가리킨 문자의 아스키코드 넘버]의 값을 1씩 더해주어 s의 문자별 개수 데이터를 저장한다
알파벳 뒤부터 안으로 가야하므로 Z부터 A까지 하나씩 빼며 더하여 수행한다
홀수 개수를 갖는 문자가 하나면 mid 를 만들어주고 홀수 개수를 갖는 문자가 2개 이상이면 탈출한다
빈 결과문부터 시작해서 양옆에 문자를 하나씩 붙여서 만들어주고 홀수개수 문자가 딱 하나 있어서 mid 가 있다면
결과문 시작부터 결과문 길이 반만큼의 위치에 mid를 삽입한다
홀수 개수를 갖는 문자가 2개 이상이면 실패문구를 출력하고, 그 외에는 정상 결과문을 출력한다
어려웠던 점
아스키 코드 비교를 위해 cnt[200] 를 만들어 문자 개수를 카운트 하는 점
홀수 개수가 하나면 그 하나를 써서 mid 를 만들고 하나를 썼으니 --하여 짝수로 만드는 점
한 문자 개수 2개당 한번씩 빈 결과 문자열에 양옆에 하나씩 붙여주는 점
mid를 처음+결과열 사이즈 절반 만큼 붙인 위치인 가운데에 넣어주는 점
개인적으로 매우 어려웠던 문제다. 꼭 복습하자
#include <bits/stdc++.h>
using namespace std;
string s;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
// cnt 는 아스키 코드가 담긴 배열. 아스키 코드는 127개이니 127개 이상으로 여유있게 할당하자
// main 함수내에서 선언하면 main 함수도 함수내 선언이므로 기본 0 초기화가 되지 않는다
// 전역변수만이 0으로 디폴트 초기화 되므로 함수 내 변수는 꼭 초기화를 해주자
int cnt[200]={0};
int flag=0;
char mid=0;
string ret;
cin >> s;
// s를 돌며 문자를 하나씩 더해가며 s의 문자당 개수 카운트. s의 하나하나인 k 는 문자이므로 char, int, auto 다 된다
for(int k : s){
cnt[k]++;
}
// Z부터 A까지 줄여나가면서 각 문자별로 실행한다
for(int i='Z'; i>='A'; i--){
// 중복되는 문자가 있다면(1이상이라면 true) 실행해라
if(cnt[i])
// 홀수인지 확인하고( cnt[i]&1 의 경우도 홀수이다 - 비트연산자- 마지막 비트가 1이면 홀수라는 연산 )
if(cnt[i]%2==1){
//홀수라면 가운데에 둘걸 mid라 하고 그 하나를 중복개수에서 빼준다. 보기 좋도록 char(i)로 형변환을 해도 된다
mid=char(i);
cnt[i]--;
// 홀수인 문자 개수에 카운트
flag++;
}
// 홀수인 문자 개수가 2개라면 문자 더 돌거 없이 반복문 종료
if(flag==2)
break;
// 중복 개수가 2개 단위로 있으므로(홀수면 위에서 --됨) 2개 늘때마다 한번만 실행하도록 j+=2씩 증가
// 중복 문자 2개당 결과문자열 ret 앞뒤로 하나씩 붙여준다
for(int j=0; j<cnt[i]; j+=2){
ret = char(i) + ret;
ret = ret + char(i);
}
}
// 홀수여서 mid로 삼을게 하나 있다면 mid !=0 이므로 실행해라.
// 홀수개여서 만든 mid 를 결과문 ret의 가운데에 삽입해라
// 가운데는 시작위치 + 결과문 길이 절반 이다
if(mid){
ret.insert(ret.begin()+ret.size()/2, mid);
}
// 홀수인 문자 개수가 2개라면 다음을 출력해라
if(flag==2){
cout << "I'm Sorry Hansoo\n";
// 아니면 다음을 출력해라 - 결과문자열 ret
} else {
cout << ret << "\n";
}
return 0;
}
'개발 노트 > 백준, 프로그래머스 풀이' 카테고리의 다른 글
백준 3986/c++ )) 좋은 단어 - 오답 (0) | 2022.06.16 |
---|---|
stack, queue 사용 시 size()를 꼭 써줘야한다 (0) | 2022.06.16 |
백준 9375/c++ )) 패션왕 신해빈 (0) | 2022.06.15 |
백준 1620/c++ )) 나는야 포켓몬 마스터 이다솜 (0) | 2022.06.15 |
[c++] 로또의 최고 순위와 최저 순위 (0) | 2022.06.15 |
댓글