devlog

[SWEA] 1240 단순 2진 암호코드-java 본문

Algorithm/SWEA

[SWEA] 1240 단순 2진 암호코드-java

bellaah 2019. 7. 2. 17:24

문제:https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD&categoryId=AV15FZuqAL4CFAYD&categoryType=CODE&&&

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

import java.io.*;
import java.util.StringTokenizer;
public class swea_1240_p2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
int n, m, answer = 0;
String str, tmp, sub = "";
int[] decimalNum = new int[8];
String[] code = { "0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011",
"0110111", "0001011" };
for (int i = 1; i <= num; i++) {
int count = 0;
boolean isFind = false;
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
for (int j = 0; j < n; j++) {
str = br.readLine();
for (int k = m - 1; k >= 0 && !isFind; k--) {
if (str.charAt(k) == '1') {
sub = str.substring(k - 55, k + 1);
isFind = true;
}
}
}
for (int k = 0; k < sub.length(); k = k + 7) {
tmp = sub.substring(k, k + 7);
for (int l = 0; l < code.length; l++) {
if (tmp.equals(code[l])) {
decimalNum[count++] = l;
}
}
}
answer = (decimalNum[0] + decimalNum[2] + decimalNum[4] + decimalNum[6]) * 3 + decimalNum[1] + decimalNum[3]
+ decimalNum[5] + decimalNum[7];
if (answer % 10 == 0) {
answer = 0;
for (int j = 0; j < decimalNum.length; j++) {
answer += decimalNum[j];
}
} else {
answer = 0;
}
System.out.println("#" + i + " " + answer);
}
}
}
view raw SWEA_1240.java hosted with ❤ by GitHub

풀이

문제는 암호 코드가 정상인지 아닌지를 판별하는 것입니다.

정상인 암호코드는 8개의 숫자를 첫 번째부터 여덟 번째로 본다면 “(홀수 자리의 합 x 3) + 짝수 자리의 합 + 검증 코드” 가 10이 되어야 합니다.

그런데 입력에 0을 포함하는 경우가 있는데 거기서 암호코드를 추출하는 방법은 이렇습니다.

0~9를 의미하는 코드 중 한 줄(7자리)의 마지막 수는 1이기때문에 한 줄씩 입력받았을 때 뒤에서부터 확인하여 1을 찾으면 그 1부터 56번째(숫자 하나 당 7자리 *8개) 전 숫자까지 잘라서 추출할 수 있습니다.

하나의 숫자를 의미하는 코드는 7개의 숫자가 5줄이지만 5줄 모두 똑같으므로 한 줄만 찾으면 나머지 코드는 확인하지 않아도 상관없기 때문에 저는 한 줄을 찾으면 나머지 부분은 검사하지 않고 바로 코드를 담아놓은 code 배열과 비교하였습니다.

code배열에는 각 인덱스에 해당하는 암호코드를 넣어놓았고 추출한 암호 코드를 8 부분으로 잘라서 code 배열에서 똑같은 코드를 찾는다면 그 인덱스 값이 코드가 가리키는 숫자입니다.

이렇게 찾게 된 8개의 숫자를 decimalNum이라는 배열에 하나씩 넣어줍니다.

그리고 암호코드가 정상인지 판별하기 위하여 위에서 본 조건대로 계산을 하고 맞다면 decimalNum에 있는 모든 수를 더하여 출력하고 그렇지 않다면 answer를 0을 넣어 0을 출력합니다.

'Algorithm > SWEA' 카테고리의 다른 글

[SWEA] 2806 N-Queen-java  (405) 2019.11.03
[SWEA] 1868 파핑파핑 지뢰찾기-java  (0) 2019.11.02
Comments