fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 22251 (C++) 빌런 효석
최초 업로드: 2025-03-15 04:41:00
최근 수정 시간: 2025-07-25 10:14:54
게시자: rlatjwls3333
카테고리: 백준
조회수: 7
# [Gold V] 빌런 호석 [문제 링크](https://www.acmicpc.net/problem/22251) ## 문제 설명 <p>치르보기 빌딩은 $1$층부터 $N$층까지 이용이 가능한 엘리베이터가 있다. 엘리베이터의 층수를 보여주는 디스플레이에는 $K$ 자리의 수가 보인다. 수는 $0$으로 시작할 수도 있다. $0$부터 $9$까지의 각 숫자가 디스플레이에 보이는 방식은 아래와 같다. 각 숫자는 7개의 표시등 중의 일부에 불이 들어오면서 표현된다.</p> <p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/fcb7dfaf-672b-48c4-bb25-7adf16fe106e/-/preview/" style="width: 659px; height: 100px;"></p> <p>예를 들어 $K=4$인 경우에 $1680$층과 $501$층은 아래와 같이 보인다.</p> <p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/7197c436-b131-43ac-b14c-3e3b5f8c27ed/-/preview/" style="width: 276px; height: 100px;"> <img alt="" src="https://upload.acmicpc.net/ad62e659-8aef-4284-bd13-47df4a4ccbca/-/preview/" style="width: 276px; height: 100px;"></p> <p>빌런 호석은 치르보기 빌딩의 엘리베이터 디스플레이의 LED 중에서 최소 $1$개, 최대 $P$개를 반전시킬 계획을 세우고 있다. 반전이란 켜진 부분은 끄고, 꺼진 부분은 켜는 것을 의미한다. 예를 들어 숫자 $1$을 $2$로 바꾸려면 총 5개의 LED를 반전시켜야 한다. 또한 반전 이후에 디스플레이에 올바른 수가 보여지면서 $1$ 이상 $N$ 이하가 되도록 바꿔서 사람들을 헷갈리게 할 예정이다. 치르보기를 사랑하는 모임의 회원인 당신은 호석 빌런의 행동을 미리 파악해서 혼쭐을 내주고자 한다. 현재 엘리베이터가 실제로는 $X$층에 멈춰있을 때, 호석이가 반전시킬 LED를 고를 수 있는 경우의 수를 계산해보자.</p> ## 입력 <p>$N, K, P, X$ 가 공백으로 구분되어 첫째 줄에 주어진다.</p> ## 출력 <p>호석 빌런이 엘리베이터 LED를 올바르게 반전시킬 수 있는 경우의 수를 계산해보자.</p> ## 풀이 #### 전광판으로 P번 이하의 반전으로 만들 수 있는 1부터 N까지의 수의 개수를 세는 문제입니다. #### N의 범위가 크지 않아서 브루트포스로 풀면 됩니다. ``` #include<bits/stdc++.h> using namespace std; bool num[10][8] = { {1, 1, 1, 0, 1, 1, 1}, // 0 {0, 0, 1, 0, 0, 1, 0}, // 1 {1, 0, 1, 1, 1, 0, 1}, // 2 {1, 0, 1, 1, 0, 1, 1}, // 3 {0, 1, 1, 1, 0, 1, 0}, // 4 {1, 1, 0, 1, 0, 1, 1}, // 5 {1, 1, 0, 1, 1, 1, 1}, // 6 {1, 0, 1, 0, 0, 1, 0}, // 7 {1, 1, 1, 1, 1, 1, 1}, // 8 {1, 1, 1, 1, 0, 1, 1}, // 9 }; int getCnt(int from, int to) { // a에서 b로 변환시키는데 필요한 반전 횟수 계산 if(from==to) return INT_MAX; // 자기 자신을 만드는 경우 제외 string a = to_string(from); string b = to_string(to); // 길이를 똑같이 맞추기 while(b.length()<a.length()) b = '0'+b; while(a.length()<b.length()) a = '0'+a; int total=0; for(int i=0;i<a.length();i++) { for(int j=0;j<8;j++) { total += num[a[i]-'0'][j]!=num[b[i]-'0'][j]; // 두 번호를 비교해서 켜져있는 것이 다른 수만큼 반전이 필요함 } } return total; } int main() { ios::sync_with_stdio(0); cin.tie(0); int N, K, P, X; cin >> N >> K >> P >> X; int cnt=0; for(int i=1;i<=N;i++) { if(getCnt(X, i)<=P) { // P번보다 적은 횟수로 i를 만들 수 있다면 cnt+1 cnt++; } } cout << cnt; } ```