본문 바로가기
dev/코딩테스트

[Softeer - Lv2] 전광판

by dev-everyday 2025. 2. 27.
반응형

문제

현대차그룹에 다니는 당신은 전세계 유가 변동에 대해 실시간으로 파악하기 위해 사무실에 유가를 실시간으로 표시하는 전광판을 설치하였다. 전광판은 최대 다섯 자리의 자연수만을 표시할 수 있도록, 아래와 같이 육각형 모양의 전구 7×5=35개로 구성되어 있다.

 

 

8자 모양의 전구 묶음은 0부터 9까지의 숫자를 표현할 수 있으며, 표현 방법은 아래와 같다. 아래 그림에서 전구가 켜졌으면 검정색, 꺼졌으면 옅은 회색으로 표현되었다.

 

 

예를 들어, 전광판을 통해 9881를 표현하면 아래와 같다. 만의 자리 수가 없기 때문에, 만의 자리에 해당하는 전구들이 모두 꺼져 있음에 유의하라.

 

 

예를 들어, 전광판을 통해 10724를 표현하면 아래와 같다.

 

 

각각의 전구에는 스위치가 달려 있다. 전구에 달려 있는 스위치를 누를 때, 그 전구가 켜져 있었다면 꺼지고, 그 전구가 꺼져 있었다면 켜진다.

 

지금 전광판에 자연수 A가 표시되어 있는데, 유가가 변동됨에 따라 전광판에 표시된 자연수를 B로 바꿔야 한다. 이러한 목표를 달성하기 위해 스위치를 최소 몇 번 눌러야 하는지를 구하는 프로그램을 작성하라.

 

풀이

이 문제는 비트를 이용해서 풀었다.

7개의 비트를 기준으로 숫자로 나타냈을 때 아래와 같았다.

 2
1 3
 4
5 6    
 7

0 = 1110111 = 127-8=119
1 = 0010010 = 2+16 = 18
2 = 0111101 = 1+4+8+16+32 = 61
3 = 0111011 = 1+2+8+16+32 = 59
4 = 1011010 = 2+8+16+64 = 90
5 = 1101011 = 1+2+8+32+64 = 107
6 = 1101111 = 1+2+4+8+32+64 = 127 - 16 = 111
7 = 1110010 = 2+16+32+64 = 114
8 = 1111111 = 127
9 = 1111011 = 127 - 4 = 123

 

그리고 10씩 나머지를 확인하면서 비교를 하는데 여기서 주의해야할 점은 몫이 0이라면 그 전광판은 꺼진 전광판이라 생각하고 예외 처리를 해줘야 한다.

 

코드

#include<iostream>
using namespace std;
int num[10]={119,18,61,59,90,107,111,114,127,123};

int main(int argc, char** argv)
{
    int T;
    scanf("%d", &T);
    while(T--){
        int a, b;
        scanf("%d %d", &a, &b);
        int digit = 5;
        int ans = 0;
        while(digit--){
            int remain_a = a%10;
            int remain_b = b%10;
            int diff = 0;
            if(a==0&&b==0){
                break;
            } else if(b==0){
                diff = num[remain_a];
            } else if(a==0){
                diff = num[remain_b];
            } else{
                diff = num[remain_b]^num[remain_a];
            }
            while(diff>0){
                if(diff%2==1){
                    ans++;
                }
                diff/=2;
            }
            a/=10;;
            b/=10;
        }
        printf("%d\n", ans);
    }
    return 0;
}
import java.io.*;
import java.util.*;

public class Main {
    static int[] num = {119, 18, 61, 59, 90, 107, 111, 114, 127, 123};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder(); 

        while (T-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int digit = 5;
            int ans = 0;

            while (digit-- > 0) {
                int remainA = a % 10;
                int remainB = b % 10;
                int diff;

                if (a == 0 && b == 0) {
                    break;
                } else if (b == 0) {
                    diff = num[remainA];
                } else if (a == 0) {
                    diff = num[remainB];
                } else {
                    diff = num[remainB] ^ num[remainA];
                }

                ans += Integer.bitCount(diff);

                a /= 10;
                b /= 10;
            }

            sb.append(ans).append("\n");
        }

        System.out.print(sb.toString());
    }
}
반응형

'dev > 코딩테스트' 카테고리의 다른 글

[BOJ - 2169] 로봇 조종하기  (0) 2025.03.20
[Softeer - Lv2] 회의실 예약  (6) 2025.02.28
[Softeer - Lv2] GBC  (4) 2025.02.27
[Softeer - Lv2] 비밀 메뉴  (0) 2025.02.26
[Softeer - Lv2] 진정한 효도  (2) 2025.02.26