알고리즘 공부/C++

SWEA 5658번 [모의 SW 역량테스트] 보물상자 비밀번호 C++ 문자열, 정렬

마달랭 2024. 8. 19. 14:03
반응형

리뷰

부분 문자열 생성과 문자열로 이루어진 16진수를 10진수로 변환하고, 정렬하는 문제

 

문제 풀이

  1. 각 테스트 케이스마다 정수 n, k값과 문자열 s를 받아와 준다.
  2. 정수형 벡터 lst를 초기화 하고, n번의 for문을 돌려준다.
  3. 문자열 s의 앞 부터 n을 4로 나눈 값 만큼의 부분의 부분 문자열을 생성하고 이를 10진수로 변환해 준다.
  4. 만약 lst 내에 해당 숫자가 없을 경우 lst에 추가해준다.
  5. 그리고 제일 앞쪽의 문자를 뒤쪽으로 옮긴 뒤 탐색을 계속 진행해 준다.
  6. for문이 종료되었을 경우 lst를 내림차순으로 정렬해 주고 k - 1 번째 인덱스의 수를 출력해 주면 된다.

 

참고 사항

stoi(temp, nullptr, 16);

문자열을 16진수로 인식하고 10진수로 변환하는 함수

 

정답 코드

#include<iostream>
#include<deque>
#include<vector>
#include<algorithm>
#include<string>

using namespace std;

int tc, n, k;

int main() {
	cin >> tc;
	for (int c = 1; c <= tc; c++) {
		string s;
		cin >> n >> k >> s;
		vector<int> lst;
		for (int i = 0; i < n; i++) {
			string temp = s.substr(0, n / 4);
			int convert = stoi(temp, nullptr, 16);
			if (find(lst.begin(), lst.end(), convert) == lst.end()) lst.push_back(convert);
			s = s.substr(1, n - 1) + s[0];
		}
		sort(lst.begin(), lst.end(), greater<int>());
		cout << "#" << c << " " << lst[k - 1] << "\n";
	}
}

 

728x90
반응형