🙇‍♀️[Silver IV] 숫자세는 양 (Large) - 14382

문제 링크

성능 요약

메모리: 2020 KB, 시간: 0 ms

분류

구현, 시뮬레이션

제출 일자

2024년 3월 5일 10:48:30

문제 설명

블리트릭스라는 양은 더 빨리 잠을 들기 위한 전략을 세웠다.

먼저, 숫자 N을 뽑는다. 그리고 N, 2 × N, 3 × N 등을 떠올린다. 숫자를 떠올릴 때 마다, 그 숫자의 모든 자리수의 숫자들을 적어놓는데, 이미 적은 숫자는 또 적지 않는다. 0에서 9까지의 모든 숫자가 적히게 되면 잠이 든다.

블리트릭스는 N에서 시작해서 i × N 후에는 (i + 1) × N을 떠올리게 된다. 예를 들어 N = 1692 일 경우, 다음 과 같이 진행된다:

  • N = 1692. 1, 2, 6, 9가 기록된다.
  • 2N = 3384. 1, 2, 3, 4, 6, 8, 9가 기록된다.
  • 3N = 5076. 모든 수가 기록되고, 잠에 빠진다.

블리트릭스가 잠에 빠지는 수는 무엇인가? 영원히 잠에 들 수 없다면 INSOMNIA라고 출력하라.

입력

첫 번째 행은 케이스의 개수, T이다. 다음 행부터는 T개의 케이스들이 나온다. 각 케이스는 블리트릭스가 고른 하나의 숫자 N으로 구성된다.

제한

  • 1 ≤ T ≤ 100.
  • 0 ≤ N ≤ 106.

출력

각 케이스에 대해서, 케이스 번호가 x이고 y가 정답일 때, Case #x: y라고 출력해야 한다.

🚀풀이

자릿수가 나왔는지 여부를 기록할 배열을 만들고 문제의 조건대로 풀면 됨.

자릿수 체크로 get_digit이란 함수를 만들었다.

void get_digit(int num)
{
	while (num > 0)
	{
		cache[num % 10] = 1;
		num /= 10;
	}
}

그리고 자릿수가 다 나왔는지 확인하는 함수로 is_end를 만들었다.

bool is_end()
{
	for (int i = 0; i < 10; ++i)
	{
		if (cache[i] < 1)
			return false;
	}

	return true;
}

image

🚀전체 코드

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>

using namespace std;

int t;
int cache[10];

void get_digit(int num)
{
	while (num > 0)
	{
		cache[num % 10] = 1;
		num /= 10;
	}
}

bool is_end()
{
	for (int i = 0; i < 10; ++i)
	{
		if (cache[i] < 1)
			return false;
	}

	return true;
}

void solve()
{
	cin >> t;
	for (int i = 1; i <= t; ++i)
	{
		int n, cnt = 1, idx = 2;
		cin >> n;

		while (true)
		{
			int temp = n * cnt;
			if (n == n * 2)
			{
				cout << "Case #" << i << ": INSOMNIA" << '\n';
				break;
			}

			get_digit(temp);
			if (is_end() == true)
			{
				cout << "Case #" << i << ": " << temp << '\n';
				break;
			}
			cnt++;
		}

		memset(cache, 0, sizeof(cache));
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}