링크
https://softeer.ai/practice/info.do?idx=1&eid=624&sw_prbl_sbms_sn=246435
Softeer
연습문제를 담을 Set을 선택해주세요. 취소 확인
softeer.ai
문제 풀이
전광판의 숫자가 변할 때 몇 개의 전등의 스위치를 눌러야 하는지를 구해야 합니다.
이 때 전광판의 한 글자의 전등은 7개로 구성되어 있습니다.
먼저, 이 7개의 전등의 임의의 순서를 부여하여 어떤 숫자가 몇 번 전광판을 눌러야 하는지를 2차원 배열로 저장했습니다.
그 후 숫자 2개를 String으로 입력받았습니다.
String으로 받은 이유는 한 글자씩 비교하기 편했고 자릿수 차이로 인해 불이 꺼진 전광판을 N 으로 구분하기 위해서 였습니다.
숫자 2개의 길이를 비교해서 길이가 짧은 쪽에 N을 추가해 길이가 긴 쪽과 같은 길이를 만들도록 했습니다.
그 다음 한 글자씩 비교해서 전등을 몇 번 눌러야 하는지를 구했습니다.
이 때 한 쪽에 N이 있으면 나머지 숫자의 전등은 모두 끄든, 키든 해야 함으로 전부 더해줬습니다.
양쪽에 N이 없다면 전등을 비교하여 몇 개의 전등의 스위치를 눌러야 하는지 계산해서 정답을 구했습니다.
소스 코드
import java.util.*;
import java.io.*;
/*
숫자별 눌러야 하는 부분을 배열로 저장
전의 숫자와 후의 숫자의 같은 자릿수의 하나씩 비교
배열을 비교해 다른 부분을 세어준다.
*/
public class Main
{
// 0 ~ 9 까지 번호의 어떤 부분이 불이 들어와야하는지 저장
public static void init() {
numberLight = new int[10][7];
// 0
numberLight[0][0] = 1;
numberLight[0][1] = 1;
numberLight[0][2] = 1;
numberLight[0][4] = 1;
numberLight[0][5] = 1;
numberLight[0][6] = 1;
// 1
numberLight[1][2] = 1;
numberLight[1][5] = 1;
// 2
numberLight[2][0] = 1;
numberLight[2][2] = 1;
numberLight[2][3] = 1;
numberLight[2][4] = 1;
numberLight[2][6] = 1;
// 3
numberLight[3][0] = 1;
numberLight[3][2] = 1;
numberLight[3][3] = 1;
numberLight[3][5] = 1;
numberLight[3][6] = 1;
// 4
numberLight[4][1] = 1;
numberLight[4][2] = 1;
numberLight[4][3] = 1;
numberLight[4][5] = 1;
// 5
numberLight[5][0] = 1;
numberLight[5][1] = 1;
numberLight[5][3] = 1;
numberLight[5][5] = 1;
numberLight[5][6] = 1;
// 6
numberLight[6][0] = 1;
numberLight[6][1] = 1;
numberLight[6][3] = 1;
numberLight[6][4] = 1;
numberLight[6][5] = 1;
numberLight[6][6] = 1;
// 7
numberLight[7][0] = 1;
numberLight[7][1] = 1;
numberLight[7][2] = 1;
numberLight[7][5] = 1;
// 8
numberLight[8][0] = 1;
numberLight[8][1] = 1;
numberLight[8][2] = 1;
numberLight[8][3] = 1;
numberLight[8][4] = 1;
numberLight[8][5] = 1;
numberLight[8][6] = 1;
// 9
numberLight[9][0] = 1;
numberLight[9][1] = 1;
numberLight[9][2] = 1;
numberLight[9][3] = 1;
numberLight[9][5] = 1;
numberLight[9][6] = 1;
}
static int T; // 테스트 케이스
static String before; // 전 자연수
static String after; // 후 자연수
static StringBuilder sb;
static StringTokenizer st;
static int[][] numberLight;
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
init();
T = Integer.parseInt(br.readLine());
for(int seq = 0; seq < T; seq++) {
st = new StringTokenizer(br.readLine());
before = st.nextToken();
after = st.nextToken();
solution(before, after);
}
System.out.println(sb);
}
public static void solution(String before, String after) {
int beforeLength = before.length();
int afterLength = after.length();
StringBuilder strbuild = new StringBuilder();
// 자릿수가 다르면 N을 추가해서 자릿수를 같게 해준다.
if(beforeLength > afterLength) {
for(int i = 0; i < beforeLength - afterLength; i++) {
strbuild.append("N");
}
String data = strbuild.toString();
after = data + after;
}
else {
for(int i = 0; i < afterLength - beforeLength ; i++) {
strbuild.append("N");
}
String data = strbuild.toString();
before = data + before;
}
int answer = 0;
// N이 있다면 불이 꺼진 경우이므로 불이 켜진 스위치를 전부 더한다.
// N이 없다면 숫자가 있다는 것이니 숫자의 차이만큼 스위치 더한다.
for(int i = 0; i < after.length(); i++) {
int check = 0;
if(before.charAt(i) == 'N') {
int afterNum = (int)(after.charAt(i) - '0');
for(int j = 0; j < 7; j++) {
if(numberLight[afterNum][j] == 1) {
check++;
}
}
}
else if(after.charAt(i) == 'N') {
int beforeNum = (int)(before.charAt(i) - '0');
for(int j = 0; j < 7; j++) {
if(numberLight[beforeNum][j] == 1) {
check++;
}
}
}
else {
int beforeNum = (int)(before.charAt(i) - '0');
int afterNum = (int)(after.charAt(i) - '0');
if(beforeNum != afterNum) {
for(int j = 0; j < 7; j++) {
if(numberLight[beforeNum][j] != numberLight[afterNum][j]) {
check++;
}
}
}
}
// System.out.println(beforeNum + " " + afterNum + " " + check);
answer += check;
}
sb.append(answer).append("\n");
}
}