https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제에서 정해준 값들은
T = 테스트 케이스 갯수
N = 입력되는 배열의 세로
M = 입력되는 배열의 가로
그리고
핵심적으로 각 암호 숫자가 어떤 값을 의미하는지 알려주었다.
0001101 = 0
0011001 = 1
0010011 = 2
0111101 = 3
0100011 = 4
0110001 = 5
0101111 = 6
0111011 = 7
0110111 = 8
0001011 = 9
로 값을 정해주었다.
문제 화면에서는 밑에 0 과 1의 비율도 알려주는데 그냥 헷갈리도록 하는 장치 인것 같다.
그리고 N x M 의 배열에 7개의 비트로 8자리인 가로가 56자리 0과 1로 이루어진 암호코드가 랜덤한 자리에 주어진다.
이안에서 해당 암호가 옳바른 암호인지 구별하기 위해 (홀수 자리의 합 x 3) + (짝수 자리의 합)이 10의 배수인지 확인한뒤
10의 배수 라면 모두 더한 값을 출력하고
아니라면 0을 출력하여 잘못되었다고 한다.
내가 제출한 코드는 다음과 같
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
public class Solution {
static List<String> answer = Arrays.asList("0001101", "0011001", "0010011", "0111101", "0100011", "0110001","0101111", "0111011","0110111", "0001011");
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T;
T =Integer.parseInt(br.readLine());
for(int test_case = 1; test_case <= T; test_case++) {
StringTokenizer st = new StringTokenizer(br.readLine() , " " );
int n,m;
String[] answerBycode = new String[8];
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
int[][] code = new int[n][m];
int line =-1;
//암호 코드 다 넣기
for(int i = 0; i < n;i++){
String str = br.readLine();
for(int j =0; j<m;j++){
code[i][j] = Character.getNumericValue(str.charAt(j));
if(code[i][j] == 1 && line == -1){
line = i;
}
}
}
String str = Arrays.toString(code[line]).replaceAll("[^0-9]", "");
int index = str.lastIndexOf("1") - 55;
int indexEnd = index + 7;
for(int i =0; i<8;i++){
answerBycode[i] = str.substring(index+(7*i) ,indexEnd + (7 *i));
answerBycode[i] = matchAnswer(answerBycode[i]);
}
int result = verf(answerBycode);
System.out.println("#" + test_case + " "+ result);
}
}
public static String matchAnswer(String answerByCode){
int find = answer.indexOf(answerByCode);
if(find != -1){
return Integer.toString(find);
}
return Integer.toString(0);
}
public static int verf(String[] answerBycode){
int result = 0;
for(int i = 0; i<8;i++){
if((i + 1) %2 == 0){ //짝수
result += Integer.parseInt(answerBycode[i]);
}
if((i +1) %2 != 0){ //홀수
result += 3* Integer.parseInt(answerBycode[i]);
}
}
System.out.println(result);
if(result % 10 == 0){ // 올바른 코드
result = 0;
for(int i=0;i<8;i++){
result += Integer.parseInt(answerBycode[i]);
}
return result;
}
return 0;
}
}
먼저 입력은 다 받아야하니 이중 for문으로 값을 받아 넣어준다. 그러다 암호코드가 들어간 열을 발견하면 해당열을 line이라는 변수에 기록해둔다.
그 뒤 배열을 string으로 변환한뒤 제일 뒤에서 1을 찾는다.
이유는 주어진 암호 값들을 보면 제일 뒤가 1로 끝나는 것을 알 수 있다.
따라서 제일 끝에 1을 찾은뒤 일정 숫자를 빼주면 첫번째 자리를 찾을 수 있다.
그리고 substring을 이용하여 7자리씩 옮겨가며 잘라 배열에 넣어준다.
그 뒤 주어진 암호와 비교하는 matchAnswer로 비교한뒤 값을 넣어준다.
받은 배열을 다시 주어진 조건에 맞는지 확인하는 verf함수에 넣어 확인하고 값을 받아
출력해준다.
'SWEA' 카테고리의 다른 글
SWEA 1249. [S/W 문제해결 응용] 4일차 - 보급로 (0) | 2023.11.06 |
---|---|
SWEA 1954. 달팽이 숫자 Java (0) | 2023.11.05 |
SWEA 1244 최대상금 JAVA (0) | 2023.11.03 |
SWEA 1859 백만 장자 프로젝트 (0) | 2023.11.03 |
SWEA 1221 [S/W 문제해결 기본] 5일차 - GNS (0) | 2023.10.30 |