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
- unity
- 유니티
- LookRotation
- git-lfs
- 알고스팟
- 유니티 ResourceManager
- 이진트리
- c++
- 코드블럭 테마
- 유니티 Collision
- LayerMask
- 유니티 Rotate
- 오브젝트 풀링
- eulerAngles
- Quaternion.Euler
- 유니티 Vector3
- 소스코드 줄번호
- 너비 우선 탐색
- 유니티 시야 가림
- 깊이 우선 탐색
- 유니티 InputManager
- 유니티 리소스매니저
- 유니티 머신러닝
- InputManager
- c++ 문자열 자르기
- Raycast
- ML-Agents
- 유니티 오브젝트 풀링
- Mathf.Clamp
- LFS
Archives
- Today
- Total
무민은귀여워
[프로그래머스] 2022 KAKAO BLIND RECRUITMENT 신규 아이디 추천 본문
반응형
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
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 |