그럴듯한 개발 블로그
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/72410

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

처음 풀어 보는 문자열 파싱 문제다. 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공부해야겠다

반응형
profile

그럴듯한 개발 블로그

@donghyk2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!