https://school.programmers.co.kr/learn/courses/30/lessons/72410
처음 풀어 보는 문자열 파싱 문제다. minishell 파싱 순한 맛이다.
눈만 크게 뜨고 있으면 쉬운 문제였다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string get_delete_x_string(string original)
{
string res = "";
for (int i = 0; i < original.size(); i++)
if (original[i] != 'X')
res += original[i];
return (res);
}
string solution(string new_id) {
for (int i = 0; i < new_id.size(); i++) // 1단계
if (new_id[i] <= 'Z' && new_id[i] >= 'A')
new_id[i] += 32; // 소문자로 바꿔줌
// cout << new_id << '\n';
for (int i = 0; i < new_id.size(); i++) // 2단계
if (!(isalnum(new_id[i]) || (new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.')))
new_id[i] = 'X'; // X는 나중에 뺄 것
// cout << new_id << '\n';
new_id = get_delete_x_string(new_id);
for (int i = 0; i + 1 < new_id.size(); i++) // 3단계
if (new_id[i] == '.' && new_id[i] == new_id[i + 1])
new_id[i] = 'X';
// cout << new_id << '\n';
new_id = get_delete_x_string(new_id);
for (int i = 0; i < new_id.size(); i++) // 4단계
{
if (new_id[0] == '.')
new_id[0] = 'X';
if (new_id[new_id.size() - 1] == '.')
new_id[new_id.size() - 1] = 'X';
}
// cout << new_id << '\n';
new_id = get_delete_x_string(new_id);
if (new_id == "") // 5단계
new_id += 'a';
// cout << new_id << '\n';
for (int i = 0; i < new_id.size(); i++) // 6단계
{
if (new_id.size() >= 16)
new_id = new_id.substr(0, 15);
for (int i = 1; i < new_id.size() - 1; i++)
{
if (new_id[new_id.size() - i] != '.')
{
new_id = new_id.substr(0, new_id.size() - i + 1);
break ;
}
}
}
// cout << new_id << '\n';
while (new_id.size() < 3) // 7단계
new_id += new_id[new_id.size() - 1];
return new_id;
}
STL string은 free malloc 자동으로 해줘서 너무 편하다. c에서 저거 또 새로 할당하고 프리할 생각 하니까 토가 나온다. cpp 만세!
다른 사람의 풀이를 보다 어이없게 잘 푸신 분 코드를 발견했다.
#include <bits/stdc++.h>
using namespace std;
string solution(string new_id) {
for (char& ch : new_id) if ('A' <= ch && ch <= 'Z') ch |= 32;
string ret;
for (char& ch: new_id) {
if ('a' <= ch && ch <= 'z' ||
'0' <= ch && ch <= '9' ||
strchr("-_.", ch)) ret += ch;
}
new_id = ret;
ret.clear();
for (char& ch: new_id) { // 개 쩐다
if (!ret.empty() && ret.back() == '.' && ch == '.') continue;
ret += ch;
}
if (ret.front() == '.') ret.erase(ret.begin());
if (ret.back() == '.') ret.pop_back();
if (ret.empty()) ret = "a";
if (ret.size() >= 16) ret = ret.substr(0, 15);
if (ret.back() == '.') ret.pop_back();
while (ret.size() <= 2) ret += ret.back();
return ret;
}
기가 막히다. 난 아직 모르는 cpp기능이 너무 많다. 빨리 42 서울 c 과제 마무리하고 cpp공부해야겠다
'<algorithm> > 프로그래머스' 카테고리의 다른 글
프로그래머스 최댓값과 최솟값 c++ (0) | 2023.05.25 |
---|---|
프로그래머스 jadencase 문자열 만들기 c++ (0) | 2023.05.25 |
프로그래머스 성격 유형 검사하기 c++ (0) | 2023.05.24 |
프로그래머스 신고 결과 받기 c++ (0) | 2023.05.24 |
프로그래머스 대충 만든 자판 c++ (2) | 2023.05.22 |