문제
풀이
이런 문제는 규칙을 찾는 것이 중요하다.
입력을 보면 0으로만 이루어진 라인이 있고, 그렇지 않은 경우에는 모두 같은 형태를 띄고 있다.
하여 입력 중 하나의 라인만 가져와 작업하도록 하였다.
0000011101101100010111011011000101100010001101001001101110110000000000
암호코드를 보면 0-9까지 모두 0으로 시작해 1로 끝나는 것을 알 수 있다.
이를 통해 알 수 있는 사실은, 오른쪽에 있는 0들은 모두 필요없는 수라는 것이다.
000001110110110001011101101100010110001000110100100110111011
0을 모두 제거하고 오른쪽 끝에서부터 7개씩 끊어 값을 대조한 후,
나머지 연산을 수행해 답을 구하면 된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class 단순2진암호코드 {
static String passwords;
static String codes[] = {
"0001101", // 0
"0011001", // 1
"0010011", // 2
"0111101", // 3
"0100011", // 4
"0110001", // 5
"0101111", // 6
"0111011", // 7
"0110111", // 8
"0001011" // 9
};
static int sum[] = new int[9];
public static int Verification() {
int n1 = 0, n2 = 0;
for (int i = 1; i < sum.length; i++) {
if (i % 2 == 1) n1 += sum[i];
else if (i % 2 == 0) n2 += sum[i];
}
if (((n1 * 3) + n2) % 10 == 0) return n1 + n2;
else return 0;
}
public static int Encode() {
int idx = 8;
for (int i = passwords.length() - 1; i > 0; i--) {
if (passwords.charAt(i) != '0') {
passwords = passwords.substring(0, i + 1);
break;
}
}
for (int i = passwords.length(); i > 7; i--) {
String temp = passwords.substring(i - 7, i);
if (Arrays.asList(codes).contains(temp)){
passwords = passwords.substring(0, i - 7);
sum[idx--] = Arrays.asList(codes).indexOf(temp);
i = passwords.length() + 1;
}
}
return Verification();
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for (int test_case = 1; test_case <= T; test_case++) {
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
passwords = "";
for (int i = 0; i < N; i++) {
boolean flag = false;
String str = br.readLine();
for (int k = 0; k < M; k++)
if (str.charAt(k) == '1') {
flag = true;
break;
}
if (flag) for (int j = 0; j < M; j++) passwords = str;
}
System.out.println("#" + test_case + " " + Encode());
}
}
}
'코딩테스트 > SWEA' 카테고리의 다른 글
[JAVA] SWEA 1244번 최대 상금 (0) | 2021.08.10 |
---|---|
[JAVA] SWEA 1242번 암호코드 스캔 (0) | 2021.08.04 |
[JAVA] SWEA 1233번 사칙연산 유효성 검사 (0) | 2021.08.03 |
[JAVA] SWEA 1232번 사칙연산 (0) | 2021.08.03 |
[JAVA] SWEA 1231번 중위순회 (0) | 2021.08.03 |
댓글