[coding test] 카카오 블라인드 2021 - 신규 아이디 추천
https://programmers.co.kr/learn/courses/30/lessons/72410
문제 Comment
카카오 블라인드 코딩 테스트의 요즘 트렌드는 "구현"입니다.
매년 인턴십, 블라인드 코테에 이런식으 조건을 부여하고 구현하는 문제들이 꼭 1문제씩은 출제합니다.
이런 문제를 접근할 때는 문제상에 구현의 힌트를 많이 주기때문에 문제와 주어진 예시를 잘 파악하는 것이 좋습니다.
문제 풀이
문자열을 control하는 문제인 만큼 파이썬이 유리할 수도 있지만 C++로 접근해도 충분히 괜찮은 문제입니다.
문제 풀이 접근에서 치환과 추가는 어렵지 않습니다.
하지만 제거의 효율을 높이고자 제거되는 문자열은 '\0'로 변경해주었습니다.
지금 생각해보면 그렇게 효율이 좋은것 같지는 않은 것 같기도...
C++의 문자열에서 '\0'은 출력상에 표현하지 않기 때문입니다.
단, 여기서 주의할 점은 string을 비교할 때, 중간에 들어간 \0은 유지가 되므로 출력이 같은 문자열이 서로 다른 문자열로 인식됩니다.
string str1 = "abcd";
string str2 = "a\0bcd";
이런 경우 C++의 채점서버는 두 문자열이 다르다고 채점을 하고 심지어 두 문자열의 길이도 str1은 4, str2는 5로 반환합니다.
따라서 길이와 관련된 작업이 있거나 제거 작업이 끝난 후에는 반드시 \0을 빼고 문자열을 재구성할 필요가 있습니다.
코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string reset(string input) {
string ret = "";
for(int i = 0; i < input.size(); i++) {
if(input[i] != '\0') ret += input[i];
}
return ret;
}
string solution(string new_id) {
string answer = "";
char m[3] = {'-', '_', '.'};
// step 1
for(int i = 0; i < new_id.size(); i++) {
new_id[i] = tolower(new_id[i]);
}
// step 2
for(int i = 0; i < new_id.size(); i++) {
bool flag = false;
if(new_id[i] < 'a' || new_id[i] > 'z') {
if(new_id[i]-'0' >= 0 && new_id[i]-'0' <= 9) continue;
else {
for(int j = 0; j < 3; j++) {
if(new_id[i] == m[j]) {
flag = true;
break;
}
}
if(!flag) {
new_id[i] = '\0';
}
}
}
}
new_id = reset(new_id);
char prev = new_id[0];
// step 3
for(int i = 1; i < new_id.size(); i++) {
if(prev == '.' && new_id[i] == '.') {
prev = new_id[i];
new_id[i] = '\0';
}else{
prev = new_id[i];
}
}
new_id = reset(new_id);
// step 4
if(new_id[0] == '.') new_id[0] = '\0';
if(new_id[new_id.size() - 1] == '.') new_id[new_id.size() - 1] = '\0';
new_id = reset(new_id);
// step 5
if(new_id.size() == 0) new_id += 'a';
// step 6
if(new_id.size() > 15) {
for(int i = 15; i < new_id.size(); i++) {
new_id[i] = '\0';
}
}
new_id = reset(new_id);
// step 4
if(new_id[0] == '.') new_id[0] = '\0';
if(new_id[new_id.size() - 1] == '.') new_id[new_id.size() - 1] = '\0';
new_id = reset(new_id);
// step 7
if(new_id.size() < 3) {
while(new_id.size() != 3) {
new_id += new_id[new_id.size() - 1];
}
}
answer = new_id;
return answer;
}
step 6를 종료한 후 양 끝의 마침표를 제거해야하므로 step4를 반드시 다시 한 번 해주셔야합니다.
반응형
'코딩테스트(알고리즘, SQL) > 프로그래머스' 카테고리의 다른 글
[프로그래머스/MySQL] Lv.2 자동차 평균 대여 기간 구하기 (0) | 2023.09.17 |
---|