문제와 관련된 내용은 위의 링크에서 확인할 수 있습니다.
나의 풀이
이 문제는 크게 3 단계로 문제가 구성되어 있다고 생각할 수 있습니다.
단계 1 - 직사각형 배열에서 암호코드 정보 찾기
문제에서 주어지는 직사각형 배열에서 필요한 암호코드는 사실 단 한줄입니다. 그렇기 때문에 직사각형 배열을 쭉 읽어 나가다가, 1이 포함된 줄이 있으면 해당 줄로만 암호 코드 계산할 수 있습니다.
단계 2 - 암호코드 정보에서 암호코드 찾기
단계 1에서 얻은 암호코드 정보는 아래와 같을 것입니다.
00000000000000011101101100010111011011000101100010001101001001101110110000000000
여기서 불필요한 0을 제거해야 하는데, 문제를 자세히 보면 모든 암호코드의 마지막 숫자가 1인 것을 확인할 수 있습니다.
저는 이 정보를 바탕으로 뒤에서부터 암호코드를 찾고자 했습니다. 1이 나올때까지 불필요한 0은 제거하고, 7개씩 암호코드 정보를 잘라서 암호코드를 얻었습니다.
7개씩 암호코드 정보를 얻은 다음에 다음 암호코드 정보의 마지막 숫자가 1이 아니라면 탐색은 종료했습니다.
단계 3 - 암호코드 판별하기
마지막은 암호코드가 옮은 암호코드인지 판별하는 부분입니다. 이는 짝수 번째와 홀수 번째를 구하고 이를 계산하면 되는 단순한 계산입니다.
이를 구현한 코드는 아래와 같습니다.
import java.util.*;
class Solution {
static String[][] passwords = {
{"0", "0", "0", "1", "1", "0", "1"},
{"0", "0", "1", "1", "0", "0", "1"},
{"0", "0", "1", "0", "0", "1", "1"},
{"0", "1", "1", "1", "1", "0", "1"},
{"0", "1", "0", "0", "0", "1", "1"},
{"0", "1", "1", "0", "0", "0", "1"},
{"0", "1", "0", "1", "1", "1", "1"},
{"0", "1", "1", "1", "0", "1", "1"},
{"0", "1", "1", "0", "1", "1", "1"},
{"0", "0", "0", "1", "0", "1", "1"}
};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T;
T = sc.nextInt();
for (int test_case = 1; test_case <= T; test_case++) {
int n = sc.nextInt();
int m = sc.nextInt();
String[][] lines = new String[n][m];
for (int i = 0; i < n; i++) {
lines[i] = sc.next().split("");
}
List<String> secretCode = new ArrayList<>(findSecretCode(lines));
for (int i = secretCode.size() - 1; i >= 0; i--) {
if (secretCode.get(i).equals("1")) {
break;
}
secretCode.remove(secretCode.size() - 1);
}
List<Integer> passwordCodes = new ArrayList<>(findPasswordCodes(secretCode));
Collections.reverse(passwordCodes);
System.out.println("#" + test_case + " " + defineIsRight(passwordCodes));
}
sc.close();
}
static List<String> findSecretCode(String[][] lines) {
for (String[] line : lines) {
boolean check = false;
for (String code : line) {
if (code.equals("1")) {
check = true;
break;
}
}
if (check) {
return Arrays.asList(line);
}
}
return new ArrayList<>();
}
static List<Integer> findPasswordCodes(List<String> secretCode) {
List<Integer> passwordCodes = new ArrayList<>();
int i = secretCode.size() - 1;
while (i >= 0) {
List<String> temp = new ArrayList<String>();
for (int j = 0; j < 7; j++) {
temp.add(secretCode.get(i));
i--;
}
Collections.reverse(temp);
for (int k = 0; k < 10; k++) {
if (Arrays.equals(passwords[k], temp.toArray())) {
passwordCodes.add(k);
break;
}
}
if (secretCode.get(i).equals("0")) {
break;
}
}
return passwordCodes;
}
static int defineIsRight(List<Integer> passwords) {
int odd = 0;
int even = 0;
for (int i = 1; i < 9; i++) {
if (i % 2 == 1) {
odd += passwords.get(i - 1);
} else {
even += passwords.get(i - 1);
}
}
if ((odd * 3 + even) % 10 == 0) {
return odd + even;
}
return 0;
}
}
'SWEA' 카테고리의 다른 글
2805. 농작물 수확하기 [D3] by Java (0) | 2023.11.17 |
---|---|
1209. [S/W 문제해결 기본] 2일차 - Sum [D3] by Java (0) | 2023.11.16 |
1208. [S/W 문제해결 기본] 1일차 - Flatten [D3] by Java (0) | 2023.11.15 |
1206. [S/W 문제해결 기본] 1일차 - View [D3] by Java (0) | 2023.11.15 |
[SWEA] 1244. [S/W 문제해결 응용] 2일차 - 최대 상금 (D3) by Java (1) | 2023.10.29 |