티스토리 뷰
#. 문제
* 이 문제의 저작권은 SW Expert Academy에 있습니다.
[입력]
가장 첫줄은 전체 테스트 케이스의 수이다.
각 테스트 케이스의 첫 줄에 두 자연수가 주어지는데 각각 배열의 세로 크기 N, 배열의 가로크기 M이다 (1≤N<50, 1≤M<100).
그 다음 N개의 줄에는 M개의 배열의 값이 주어진다.
[출력]
각 테스트 케이스의 답을 순서대로 표준출력으로 출력하며, 각 케이스마다 줄의 시작에 “#C”를 출력하여야 한다.
이때 C는 케이스의 번호이다. 같은 줄에 빈칸을 하나 두고, 입력에 주어진 배열에서 정상적인 암호코드들에 포함된 숫자들의 합을 출력한다.
[예제 풀이]
1번 케이스의 암호코드 정보를 추출하면 아래와 같다.
01110110110001011101101100010110001000110100100110111011
01110110110001011101101100010110001000110100100110111011
01110110110001011101101100010110001000110100100110111011
01110110110001011101101100010110001000110100100110111011
01110110110001011101101100010110001000110100100110111011
01110110110001011101101100010110001000110100100110111011
01110110110001011101101100010110001000110100100110111011
이 숫자가 나타내는 정보는 각각 아래와 같다.
0111011(7) 0110001(5) 0111011(7) 0110001(5) 0110001(5) 0001101(0) 0010011(2) 0111011(7)
검증코드가 맞는지 살펴보면, (7 + 7 + 5 + 2) * 3 + 5 + 5 + 0 + 7 = 80 이므로 올바른 암호코드라고 할 수 있다. 따라서 1번의 출력 값은 38이 된다.
2번 케이스도 같은 방식으로 계산할 경우, 검증코드가 틀렸음을 알 수 있다. 따라서 2번의 출력 값은 0이 된다.
#. 문제 이해
- 암호 코드의 규칙
1. 총 8개의 숫자로 이루어져 있다.
2. 앞 7자리는 상품 고유의 번호를 나타내며, 마지막 자리는 검증 코드를 나타낸다.
- 검증코드는 아래와 같은 방법으로 계산한다.
“(홀수 자리의 합 x 3) + 짝수 자리의 합 + 검증 코드” 가 10의 배수가 되어야 한다.
상품 고유의 번호가 8801234일 경우,
“( ( 8 + 0 + 2 + 4 ) x 3 ) + ( 8 + 1 + 3 ) + 검증 코드”
= “42 + 12 + 검증 코드”
= “54 + 검증 코드” 가 10 의 배수가 되어야 하므로, 검증코드는 6이 되어야 한다.
즉, 88012346 이 정상적인 암호코드고, 그 외의 검증코드가 포함된 경우 비정상적인 암호코드다.
- 성능 측정 방법
1. 세로 50. 가로 100 이하의 크기를 가진 직사각형 배열에 암호코드 정보가 포함되어 전달된다.
이 때, 하나의 배열에는 1개의 암호코드가 존재한다.
(단, 모든 암호코드가 정상적인 암호코드임을 보장할 수 없다. 비정상적인 암호코드가 포함될 수 있다.)
2. 배열은 1, 0으로 이루어져 있으며 그 안에 포함되어 있는 암호코드 정보를 확인한다.
3. 포함된 암호코드들의 검증코드를 확인하여 정상적인 암호코드인지 확인한다.
4. 정상적인 암호코드들을 판별한 뒤 이 암호코드들에 적혀있는 숫자들의 합을 출력한다.
5. 이때, 총 소요시간이 적을수록 성능이 좋은 것으로 간주된다.
- 암호코드의 세부 규칙
1. 암호코드 하나는 숫자 8개로 구성되며 시작 구분선, 종료 구분선은 별도로 존재하지 않는다.
2. 암호코드가 일부만 표시된 경우는 없다. 모든 암호코드는 8개의 숫자로 구성되어 있다.
3. 암호코드의 세로 길이는 5 ~ 50 칸이다.
4. 암호코드의 가로 길이는 총 길이는 56칸이다. 암호코드에 구성하는 숫자 하나가 차지하는 길이는 7칸이다.
#. 풀이
1. 각 숫자에 해당하는 암호 코드를 배열에 저장 ( 0 = 0001101, 1 = 0011001 ... )
2. 암호코드를 문자열로 입력받고 암호 맨 뒤에 '1'이 포함된 암호만 검증 ('0'으로만 이루어진 코드는 무조건 비정상 암호)
3. 7자리 기준으로 split한 후 해당하는 암호 코드를 배열에 저장
4. 검증코드를 확인하여 정상적인 암호 코드인지 확인
#. 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Solution1240 { /* 1. save password code */ static String[] pw_code = {"0001101","0011001","0010011","0111101","0100011", "0110001","0101111","0111011","0110111","0001011"}; public static void run() throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int tc = Integer.parseInt(br.readLine()); for(int T=0; T<tc; T++) { // Number of test cases StringTokenizer st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st.nextToken()); // Array Vertical Size int M = Integer.parseInt(st.nextToken()); // Array Horizontal Size int[] rc = new int[8]; // Array containing translated code (Real_Code) int flag = 1; for(int h=0; h<N; h++) { String code = br.readLine(); /* 2. search for a number 1 from behind a string */ int last_idx = code.lastIndexOf("1"); if (last_idx == -1 || flag == 0) { // NOT include a number 1 in a string continue; // continue if return is -1 } else { // include a number 1 in a string code = code.substring(last_idx-55, last_idx+1); for(int c=0; c<8; c++) { String temp_code = code.substring(c*7, c*7+7); for(int pw=0; pw<10; pw++) { // search the index of the element if(pw_code[pw].equals(temp_code)) { rc[c] = pw; break; } } } // password verification int check = (rc[0] + rc[2] + rc[4] + rc[6]) * 3 + (rc[1] + rc[3] + rc[5]) + rc[7]; if (check%10==0 && check>0) { // correct password code flag = 0; int total = 0; for(int j=0; j<8; j++) total += rc[j]; System.out.println("#" + (T+1) + " " + total); } else { // incorrect password code flag = 0; System.out.println("#" + (T+1) + " " + 0); } } } } } public static void main(String[] args) throws Exception { Solution1240.run(); } } | cs |
#. 결과
- Input --------------------------------------------------------
2
16 80
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
11 70
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000
------------------------------------------------------------------
- Output --------------------------------------------------------
#1 38
#2 0
------------------------------------------------------------------
'PS > Problem_Solving' 카테고리의 다른 글
[Algospot] PICNIC (경우의 수, 탐색) (0) | 2019.09.04 |
---|---|
[Algospot] BOGGLE(재귀 호출, 동적계획법) (0) | 2019.09.03 |
[SWEA] 1961. 숫자 배열 회전(JAVA) (0) | 2019.08.08 |
[SWEA] 4613. 러시아 국기 같은 깃발(JAVA) (0) | 2019.07.25 |
[SWEA] 4615. 재미있는 오셀로 게임(JAVA) (0) | 2019.07.22 |