728x90
- 관련 사이트: https://school.programmers.co.kr/learn/courses/30/lessons/120896
입력받은 문자열에서 한 번씩만 등장하는 문자들을 사전 순으로 정렬하여 표출하는 문제이다.
1) 문자열 길이가 1인 경우, 입력받은 문자열을 return
2) 문자열 사전 순으로 정렬
3) 앞뒤 문자와 모두 다를 경우, 결과 문자열로 저장 (예: aabcc → b)
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string s) {
// 문자열의 길이가 1인 경우
if (s.length() == 1)
return s;
sort(s.begin(), s.end());
string answer = "";
// 첫번째 문자가 중복이 아닌지 확인
if (s[0] != s[1])
answer += s[0];
// 가운데 문자열에서 중복이 아는 문자열 확인
int idx = 1;
for (; idx < s.length() - 1; idx++)
{
// 앞 != 비교문자 && 비교문자 != 뒤
if (s[idx - 1] != s[idx] && s[idx] != s[idx + 1])
answer += s[idx];
}
// 마지막 문자가 중복이 아닌지 확인
if (s[idx] != s[idx - 1])
answer += s[idx];
return answer;
}
각 문자의 개수를 카운팅해주는 방법도 있다.
1) 문자열 길이가 1인 경우, 입력받은 문자열을 return
2) 문자열 사전 순으로 정렬
3) 첫번째 문자 임시 저장 및 문자 개수 1개로 초기화
4) 다음 문자와 임시 저장 문자 비교
5-1) 동일한 문자일 경우, 문자 개수++
5-2) 동일한 문자가 아닐 경우, 임시 저장된 문자 개수 확인 → 임시 저장된 문자 개수가 1개인 경우, 결과 문자열로 저장
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string s) {
if (s.length() == 1)
return s;
sort(s.begin(), s.end());
string answer = "";
int cnt = 1;
char tmp = s[0];
for (int idx = 1; idx < s.length(); idx++)
{
if (s[idx] == tmp)
cnt++;
else
{
if (cnt == 1)
answer += tmp;
cnt = 1;
tmp = s[idx];
}
}
if (cnt == 1)
answer += tmp;
return answer;
}
중복된 key 값은 가지지 않는 map을 이용하여 아래와 같이 구현해줄 수도 있다.
1) 문자열의 첫번째 문자부터 마지막 문자까지 for 문 수행
2) 문자를 key 값으로 하고 개수를 카운팅
3) 개수가 1개인 경우만 결과 문자열로 저장
#include <string>
#include <map>
#include <algorithm>
using namespace std;
string solution(string s) {
if (s.length() == 1)
return s;
map<char, int> lst;
for (char c : s)
lst[c]++;
string answer = "";
for (pair<char, int> l : lst)
{
if (l.second == 1)
answer += l.first;
}
return answer;
}
728x90
'Algorithm > Programers' 카테고리의 다른 글
수 조작하기 1 (0) | 2023.06.24 |
---|---|
공배수 (0) | 2023.06.24 |
숨어있는 숫자의 덧셈 (2) (0) | 2023.06.18 |
숨어있는 숫자의 덧셈 (1) (0) | 2023.06.18 |
OX퀴즈 (0) | 2023.06.18 |
댓글