static int N, K;
static char Hexa[32];
static int table[255];
static int digit[] = { 0x1, 0x10, 0x100, 0x1000, 0x10000, 0x100000, 0x1000000, 0x10000000 };
static void table_init()
{
int n = 0;
for (int i = '0'; i <= '9'; i++)
table[i] = n++;
for (int i = 'A'; i <= 'F'; i++)
table[i] = n++;
}
static int solution()
{
list<char> treasure;
vector<int> group;
int len = 0;
scanf("%d %d", &N, &K);
scanf("%s\n", Hexa);
for (int i = 0; Hexa[i] != 0; i++)
treasure.push_back(Hexa[i]);
len = N / 4; //회전할 횟수 및 자리수
for (int cnt = 0; cnt < len; cnt++) //상자 회전
{
list<char>::reverse_iterator ritr = treasure.rbegin();
for (; ritr != treasure.rend(); )
{
int num = 0; //초기값
for (int turn = 0; turn < len; turn++) //자리수
num += table[*(ritr++)] * digit[turn];
int j;
//중복 탐색,
for (j = 0; j < group.size() && group[j] != num; j++);
if (j == group.size()) //중복되는 수가 없음
group.push_back(num);
}
treasure.push_front(treasure.back()); //끝에거를 앞에 삽입
treasure.pop_back(); //끝에거 제거
}
sort(group.begin(), group.end(), greater<int>()); //내림차순,
return group[K - 1]; //인덱스는 0부터 시작하므로,
}
문제 풀이는 예전에 풀었던 방식과 큰 차이는 없다.
//주의사항 및 정리
1. 역시 문제를 똑바로 읽을 것, K번째로 큰 값이다 -> 내림차순으로 정렬해야한다.
2. iterator 사용 시 다음 iterator로 언제 넘어갈지 확실히 해야함, -> 두번째 for문에서 하는 것이 아니라 세번째 중 첫번째 for문에서 같이 이동해야 한다.
3. 문제에서 요구하는 바를 확실히 구현 할 것, -> 끝에거를 앞에 삽입하는 거 자체는 어렵지 않으나, 해당 코드를 넣는 것을 까먹고 있었음.
4. 문자열을 scanf로 입력받을 때 딸려오는 개행은 '\n'으로 처리 할 수 있다.
'알고리즘 > SWEA' 카테고리의 다른 글
4012. 요리사 (0) | 2021.11.09 |
---|---|
5656. 벽돌 깨기 (0) | 2021.11.09 |
5644. 무선 충전 (0) | 2021.11.09 |
5650. 핀볼게임 (0) | 2021.11.08 |
8673 (0) | 2021.11.08 |