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

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

 

아스키 값 활용하여 단계별로 수행

new_id가 빈 문자열일 경우 5단계, 7단계만 수행하기 때문에 무조건 aaa 반환

 

각 단계별로 변환된 id 값을 tmp 에 저장

모든 단계를 마친 후 answer에 tmp의 값을 저장

 

while 문을 사용하여 변환 횟수를 탐지(cnt)

while문 한 번 돌 때 변환이 한번도 일어나지 않았다면 변환 완료된 경우이므로 while문 탈출 후 출력

 

 

1. 대문자의 경우 아스키 값에 32를 더한 후 char로 형변환화여 소문자로 출력

2. 아스키값 범위를 사용해서 허용된 문자가 아니면 삭제하여 저장

3, 4. 연속된 마침표를 검사하여 하나의 마침표만 출력. 해당 마침표가 시작, 끝일 경우 넘어감

5. 빈 문자열일 경우 a 저장

6. 최초 15개의 문자만 저장

7. 길이 2 이하인 id에 끝 글자를 계속 더해서 길이 3을 만듬

 

 

 

string solution(string new_id) {
	string answer = new_id;
	string tmp;
	int cnt=1;

	if (new_id.size() == 0) {
		answer.push_back('aaa');
		return answer;
	}


	while (cnt) {
		cnt = 0;
		// 1
		for (int i = 0; i < answer.size();i++) {
			int asc = answer[i];
			if (asc <= 90 && asc >= 65) {
				tmp.push_back((char)asc + 32);
				cnt++;
			}
			else
				tmp.push_back((char)asc);
		}
		answer.clear();
		answer = tmp;
		tmp.clear();

		// 2
		for (int i = 0; i < answer.size();i++) {
			int asc = answer[i];
			if (asc != 46 && asc != 45 && asc != 95 && (asc < 48 || asc>57) && (asc < 97 || asc>122)) {
				cnt++;
				continue;
			}
			else
				tmp.push_back((char)asc);
		}
		answer.clear();
		answer = tmp;
		tmp.clear();

		// 3+4
		for (int i = 0; i < answer.size();i++) {
			int asc = answer[i];
			int asc2 = answer[i + 1];
			if (asc == 46 && asc2 == 46) {
				cnt++;
				continue;
			}
			else {
				if (asc == 46 && (tmp.empty() || answer[i + 1] == NULL)) {
					cnt++;
					continue;
				}
				tmp.push_back((char)asc);
			}
		}
		answer.clear();
		answer = tmp;
		tmp.clear();


		// 5
		if (answer.size() == 0) {
			cnt++;
			answer.push_back('a');
		}


		// 6
		if (answer.size() >= 16) {
			while (answer.size() > 15) {
				cnt++;
				answer.pop_back();
			}
		}

		// 7
		if (answer.size() <= 2) {
			while (answer.size() <= 2) {
				cnt++;
				answer.push_back(answer[answer.size() - 1]);
			}

		}
	}
	return answer;
}

 

https://programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

 

* 가려진 번호는 0으로 표현

 

가려진 번호 (0) 을 제외한 나머지 번호들을 당첨 번호와 비교

비교하여 나온 숫자가 최소 당첨 (가려진 숫자가 모두 다른 경우)

비교하여 나온 숫자에 0의 개수를 더하면 최고 당첨

 

당첨된 번호의 개수를 사용하여 tmp(일치하는 숫자의 개수 당 등수) 의 요소를 탐색

 

 

 

vector<int> solution(vector<int> lottos, vector<int> win_nums) {
	vector<int> answer;
	vector<int> tmp = { 6, 6, 5, 4, 3, 2, 1 };
	int max=0;
	int min=0;
	int cnt = 0;

	for (int i = 0; i < lottos.size();i++) {
		if (lottos[i] == 0) {
			max++;
			continue;
		}
		for (int j = 0; j < win_nums.size();j++) {
			if (lottos[i] == win_nums[j]) {
				cnt++;

			}
		}
	}


	answer.push_back(tmp[cnt + max]);
	answer.push_back(tmp[cnt]);
	
	cout << answer[0] << endl;
	cout << answer[1] << endl;

	return answer;
}

 

 

* 한 사람이 여러 사람을 신고할 수 있음

* 한 사람이 동일한 사람을 여러번 신고할 경우 한 번 신고된 것으로 간주

* k 번 이상 신고된 사람은 정지. 해당 이용자를 신고한 사람들에게 메일 발송

 

 

1. 피신고자의 신고 정보를 저장

정렬은 필요 없기 때문에 unordered_map 사용 (report_count)

key 에는 피신고자 이름을 string 형태로, value에는 해당 신고자를 set<string>형태로 저장

!! 동일한 사람이 다른 이용자 한 명을 여러번 신고했을 경우 한 번 신고한 것으로 간주해야 하기 때문에 중복을 방지하는 set이 적합하다고 판단 !!

 

 

2. 신고자들의 인덱스 정보를 저장

k번 이상 신고당해 정지된 이용자들을 신고했던 신고자들의 배열 인덱스 정보 관리

역시 정렬 필요없기 때문에 unordered_map 사용 (id_index)

key에는 신고자 이름, value에는 id_list에서의 순서를 저장

 

 

3. vector<string> report 의 요소를 공백 기준으로 분류하여 신고자와 피신고자 구분

공백이 포함된 문자열을 공백 기준으로 나눠 저장하기 위해 Stringstream 사용

for 문을 활용하여 report의 요소들을 각각 분해하여 report_count에 key와 value로 저장

 

 

4. report_count탐색

value의 값이 k이상인 사람(it.second.size() >=k) 을 발견하면 value인 set을 탐색

set에 들어있는 신고자의 이름을 id_index 에서 탐색하여 id_list에서의 인덱스 정보 추출

answer의 인덱스에 해당하는 요소의 정수값을 1 증가 >> 메일 발송 횟수 1 증가

 

 

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
	vector<int> answer(id_list.size(), 0);
	unordered_map<string, set<string>> report_count;
	unordered_map<string, int> id_index;

	for (int i = 0; i < report.size();i++) {
		string first, second;

		stringstream sstream;
		sstream.str(report[i]);
		sstream >> first >> second;
		report_count[second].insert(first);
	}

	for (int i = 0; i < id_list.size();i++) 
		id_index[id_list[i]] = i;

	
	for (auto it : report_count) {
		if (it.second.size() >= k) {
			for (auto set_it : it.second) {
				int idx = id_index[set_it];
				answer[idx]++;
			}
		}
	}

	return answer;
}​

+ Recent posts