[BOJ/C++] 22251 빌런 호석

Hanbi·2024년 5월 13일
0

Problem Solving

목록 보기
110/128
post-thumbnail
post-custom-banner

문제

https://www.acmicpc.net/problem/22251

풀이

처음에는 1->2, 1->3 이런 식으로 바꿀 때 몇 개 반전시켜야하는지 전부 계산해서 배열에 저장했는데 그냥 저 디스플레이 자체를 배열로 저장해놓고 비교하면 되는 거였다.

N 범위가 생각보다 큰 것 같아서 문자열로 숫자를 접근하려고 하니까 갑자기 확 어려워졌는데 그냥 단순하게 1부터 증가시키면서 비교해도 시간초과 안 남

  1. 배열에 디스플레이 정보 저장
  2. 1부터 증가시키며 확인해줌
    2-1. i가 378일 경우에 일의 자리, 십의 자리, 백의 자리 순으로 숫자 추출해서
    2-2. 디스플레이 정보 배열과 비교
  3. 반전시켜야하는 수가 P 이하면 정답에 cnt해줌

n=378일 때, n%10 먼저 해주고, n/=10 해주면 일의 자리부터 추출되는 거 잊지 않기!

코드

#include <iostream>

using namespace std;

bool arr[10][7] = { {true, true, true, false, true, true, true}, //0
					{false, false, true, false, false, false, true}, //1
					{false, true, true, true, true, true, false}, //2
					{false, true, true, true, false, true, true}, //3
					{true, false, true, true, false, false, true}, //4
					{true, true, false, true, false, true, true}, //5
					{true, true, false, true, true, true, true}, //6
					{false, true, true, false, false, false, true}, //7
					{true, true, true, true, true, true, true}, //8
					{true, true, true, true, false, true, true}}; //9

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, K, P, X;
	int ans = 0;
	cin >> N >> K >> P >> X;
	
	for (int i = 1; i <= N; i++) {
		int cnt = 0;
		int from = X, to = i;
		if (i == X)	continue;

		for (int j = 0; j < K; j++) {
			for (int k = 0; k < 7; k++) {
				if (arr[from % 10][k] != arr[to % 10][k])	cnt++;
			}
			from /= 10; to /= 10;
		}
		if (cnt <= P)	ans++;
	}

	cout << ans;

	return 0;
}
profile
👩🏻‍💻
post-custom-banner

0개의 댓글