Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 유니티 ResourceManager
- 유니티 머신러닝
- ML-Agents
- 유니티
- 유니티 Vector3
- git-lfs
- 소스코드 줄번호
- 유니티 Rotate
- 유니티 InputManager
- 오브젝트 풀링
- 유니티 시야 가림
- Raycast
- eulerAngles
- 알고스팟
- 너비 우선 탐색
- 이진트리
- LayerMask
- 깊이 우선 탐색
- InputManager
- 유니티 리소스매니저
- LookRotation
- c++ 문자열 자르기
- 코드블럭 테마
- c++
- 유니티 Collision
- 유니티 오브젝트 풀링
- Quaternion.Euler
- Mathf.Clamp
- LFS
- unity
Archives
- Today
- Total
무민은귀여워
[프로그래머스] 2022 KAKAO BLIND RECRUITMENT 신규 아이디 추천 본문
반응형
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/72410
2. 풀이
문제에서 설명한 순서 그대로 따라했다.
1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
2-1. 첫번째 풀이
#include <iostream>
#include <vector>
using namespace std;
string solution(string new_id) {
string answer = new_id;
vector<int> chk;
// 단계 1 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
for (int i = 0; i < answer.size(); i++)
{
answer[i] = tolower(answer[i]);
// 단계 2 체크
if (!((answer[i] >= 97 && answer[i] <= 122)
|| (answer[i] >= 48 && answer[i] <= 57)
|| answer[i] == '_'
|| answer[i] == '-'
|| answer[i] == '.'))
{
chk.push_back(i);
}
}
// 단계 2 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
string tmp = "";
int pre = 0;
for (int i = 0; i < chk.size(); i++)
{
tmp += answer.substr(pre, chk[i] - pre);
pre = chk[i] + 1;
}
tmp += answer.substr(pre, answer.size() - pre);
answer = tmp;
// new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
chk.clear();
for (int i = 1; i < answer.size(); i++)
{
if (answer[i - 1] == '.' && answer[i] == '.')
{
chk.push_back(i);
}
}
tmp = "";
pre = 0;
for (int i = 0; i < chk.size(); i++)
{
tmp += answer.substr(pre, chk[i] - pre);
pre = chk[i] + 1;
}
tmp += answer.substr(pre, answer.size() - pre);
answer = tmp;
// 단계 4 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
if (answer.size() > 0 && answer[0] == '.')
answer = answer.substr(1, answer.size() - 1);
if (answer.size() > 0 && answer[answer.size() - 1] == '.')
answer = answer.substr(0, answer.size() - 1);
// 단계 5 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
if (answer.compare("") == 0)
answer = "a";
// 단계 6 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
if (answer.size() >= 16)
{
answer = answer.substr(0, 15);
if (answer.size() > 0 && answer[answer.size() - 1] == '.')
answer = answer.substr(0, answer.size() - 1);
}
// 단계 7 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
if (answer.size() <= 2)
{
char add = answer[answer.size() - 1];
int cnt = 3 - answer.size();
for (int i = 0; i < cnt; i++)
{
answer += add;
}
}
return answer;
}
2-2. 두번째 풀이
굳이 인덱스 직접 찾아가며 할 필요가 없었다.. 수정한 코드.
#include <bits/stdc++.h>
using namespace std;
string solution(string new_id) {
string answer = new_id;
string tmp = "";
for (auto ch : answer)
{
// 단계 1 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
ch = tolower(ch);
// 단계 2 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
if ((ch >= '0' && ch <= '9')
|| (ch >= 'a' && ch <= 'z')
|| strchr("-_.", ch))
{
tmp += ch;
}
}
answer = tmp;
// 단계 3 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
tmp = "";
for (auto ch : answer)
{
if (!tmp.empty() && tmp.back() == '.' && ch == '.')
continue;
tmp += ch;
}
answer = tmp;
// 단계 4 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
if (answer.front() == '.')
answer.erase(answer.begin());
if (answer.back() == '.')
answer.pop_back();
// 단계 5 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
if (answer.compare("") == 0)
answer = "a";
// 단계 6 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
if (answer.size() >= 16)
{
answer = answer.substr(0, 15);
if (answer.back() == '.')
answer.pop_back();
}
// 단계 7 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
while (answer.size() <= 2)
{
answer += answer.back();
}
return answer;
}
반응형
'IT > 알고리즘' 카테고리의 다른 글
[프로그래머스] 2019 KAKAO BLIND RECRUITMENT 오픈채팅방 (0) | 2022.05.23 |
---|---|
[프로그래머스] 2022 KAKAO BLIND RECRUITMENT 신고 결과 받기 (0) | 2022.05.16 |
시간복잡도 big-O big-Ω big-θ 공간복잡도 (0) | 2021.05.18 |
소수 찾기 - 에라토스체네스 체 (0) | 2021.05.18 |
깊이 우선 탐색, 너비 우선 탐색 구현 수도코드 (0) | 2021.05.18 |
Comments