본문 바로가기

알고리즘/SWEA

5658. 보물상자 비밀번호

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