본문 바로가기
Algorithm/PS

[코딩테스트] 카카오 모빌리티 2022 하반기 1차 코테 사용 개념 정리

by kkkdh 2022. 11. 26.
728x90

이번에는 2022년 11월 26일 카카오 모빌리티 2022년도 하반기 1차 코딩테스트에서 사용했던 개념들을 정리해보려 합니다.

 

테스트케이스는 모두 통과시켰으나, 문제의 정답 여부는 알 수가 없어서 결과는 나와봐야 알 것 같지만 난이도 자체는 쉬웠던(?) 것 같습니다.

 

특히 파이썬을 사용한다면, 쉽게 해결 가능한 문제들이었던 것 같습니다.


String compare

C++에서 string type 변수, 즉 문자열을 비교하기 위해서는 compare method를 사용합니다.

위와 같이 compare method를 사용하면, 출력 결과는 다음과 같습니다.

이 결과로 compare method를 사용하면 두 문자열이 같은 경우에는 0을 반환합니다.

만약 두 문자열이 다르다면, 사전적인 비교를 통해 method를 호출하는 string 객체에 저장된 값이 사전적으로 앞서 있는 경우 -1을 사전적으로 뒤에 있는 경우 1을 반환하는 방식으로 동작하는 method입니다.

사전적 순서 str1.compare(str2) 반환 값
str1 > str2 1
str1 == str2 0
str1 < str2 -1

 

물론, 위 예시 코드에서 사용한 바와 같이 '==' operator를 사용해 같은지 여부를 판단할 수도 있습니다만, 차이점은 '==' 연산자의 경우에는 같으면 1을 반환하고, 같지 않으면 0을 반환한다는 차이점이 있습니다.

그래서 이런 결과가 나오는 구조입니다.


C++에서의 string split

c++로 알고리즘 문제풀이를 할 때, 다른 언어에 비해 까다로운 점 중 하나가, string을 delimeter에 따라 잘라주는 method가 없다는 점입니다. 

 

그래서 split 함수를 직접 짜서 사용해야 하는데, 이번 코테에서도 활용하게 되어서 간단하게 정리해봅시다!

제가 C++ 언어를 이용해 작성해본 string type 변수를 구분자를 기준으로 나눠주는 split 함수를 구글링 결과 다양한 소스를 참고해서 짜 본 코드는 위와 같습니다.

 

물론, C에 구현되어 있는 char type 문자열을 split하는 strtok 함수도 있지만, 이 함수는 string type에는 지원되지 않기 때문에 C++ 언어를 이용한 코딩테스트를 준비하시는 분들은 대략 위와 같은 형태의 코드를 암기하고 계신 것 같습니다.

 

위 코드에서 핵심은 sstream이라는 것을 활용한다는 점인데, 우선 sstream은 string stream의 약자를 의미하며, 간단히 정리하자면, 문자열을 stream 처럼 사용할 수 있도록 돕는 라이브러리입니다. 

 

그렇기 때문에, getline 함수를 이용하여 delimeter를 기준으로 원본 문자열을 잘라 tmp string type 변수에 넣는 방식으로 잘라 vector에 저장할 수 있었습니다.

 

자세한 내용 정리는 나중에 기회가 된다면, 해보려고 합니다!

 

소스 코드 참고용

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

vector<string> split(string str, char delimeter) {
	stringstream ss(str);
	string tmp;
	vector<string> result;

	while (getline(ss, tmp, delimeter)) {
		// delimeter를 구분자로 하여 잘린 sub string tmp를 vector에 push한다.
		result.push_back(tmp);
	}
	// split result를 반환
	return result;
}

int main() {
	string test_input = "hi,hello,who,are,you";
	vector<string> split_result = split(test_input, ',');

	// 결과를 출력해봅시다.
	for (string it : split_result) {
		cout << it << endl;
	}

	return 0;
}

 

728x90

댓글