무민은귀여워

[프로그래머스] 2022 KAKAO BLIND RECRUITMENT 신규 아이디 추천 본문

IT/알고리즘

[프로그래머스] 2022 KAKAO BLIND RECRUITMENT 신규 아이디 추천

moomini 2022. 5. 20. 22:39
반응형

1. 문제

2. 풀이

2-1. 첫번째 풀이

2-2. 두번째 풀이

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;
}
반응형
Comments