[알고리즘 - SWEA]SW응용편 단순 2진 코드(JAVA)

sonnng·2023년 11월 13일
0

알고리즘

목록 보기
8/17

SWEA 단순 2진 코드 문제

이번 문제는 정확한 문제 설명도 없고 약간의 유추도 필요했던 문제다. 특히 문자열에 대한 정확한 이해와 판단이 있고 배열 활용을 잘하면 잘 풀 수 있는 문제라고 생각한다. 나는 3시간 정도 시간을 들여서 문제를 풀었지만 더 쉽게 풀 수 있는 방법도 찾았으니 참고해주면 좋을 것 같다.

로직

  1. 문자열을 줄마다 입력받으면서 String.substring(startIndex, endIndex)를 활용해 56 길이의 문자열로 자른다.

  2. 자른 이 문자열을 또 다시 7 길이로 잘라서 제시된 0~9에 해당하는 이진수인지 확인한다.

  3. (1) 만약 2번에서 0~9에 해당하는 이진수 문자열이 아니라면 boolean타입의 false 리턴
    (2) 만약 2번에서 해당하는 문자열이라면 1차원 배열의 arr에 차례대로 값을 넣고 boolean 타입의 true 리턴

  4. arr배열의 값을 하나씩 순회하며 올바른 암호코드인지(문제 내용 확인 필수) 확인 후, 맞다면 arr배열의 요소의 합을 아니라면 0을 출력한다.



import java.util.*;
import java.io.*;
class Solution{
	static int N, M;
	static int arr[];
	static String ZERO = "0001101";
	static String ONE = "0011001";
	static String TWO = "0010011";
	static String THREE = "0111101";
	static String FOUR = "0100011";
	static String FIVE = "0110001";
	static String SIX = "0101111";
	static String SEVEN = "0111011";
	static String EIGHT = "0110111";
	static String NINE = "0001011";
	static int CODE = 8;
	static boolean ifIn = false;
	
	public static void main(String args[]) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
		
		int test_case = Integer.parseInt(br.readLine());
		
		for(int tc = 1;tc<=test_case;tc++) {
			st = new StringTokenizer(br.readLine(), " ");
			
			N = Integer.parseInt(st.nextToken());
			M = Integer.parseInt(st.nextToken());
			
			arr = new int[CODE];
			int idx = 0;
			for(int i=0;i<N;i++) {
				String s = br.readLine();
				for(int j=0;j<=M-56;j++) {
					String sub = s.substring(j, j+56);
					if(ifIn == true) continue;
					if(find(sub)) {
						break;
					}
				}
			}

			
			int holsu = 0;
			int zzak = 0;
			for(int i=0;i<CODE;i++) {
				if(i%2 == 0) {
					holsu += arr[i];
				}else zzak += arr[i];
			}
			if((holsu*3 + zzak)%10 == 0) {
				sb.append("#"+tc+" ").append(holsu+zzak).append("\n");
			}else sb.append("#"+tc+" ").append(0).append("\n");
			
			ifIn = false;
		}
		
		System.out.print(sb);
	}
	public static boolean find(String s) {
		int idx = 0;
		
		for(int j=0;j<=55;j++) {
			String sub = s.substring(j, j+7);
			
			if(!sub.equals(ZERO) && !sub.equals(ONE) && !sub.equals(TWO) && !sub.equals(THREE) && !sub.equals(FOUR)
					&& !sub.equals(FIVE) && !sub.equals(SIX) && !sub.equals(SEVEN) && !sub.equals(EIGHT) && !sub.equals(NINE)) {
				ifIn = false;
				return false;
			}
			
			if(sub.equals(ZERO)){
				arr[idx++] = 0;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}else if(sub.equals(ONE)){
				arr[idx++] = 1;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}else if(sub.equals(TWO)){
				arr[idx++] = 2;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}else if(sub.equals(THREE)){
				arr[idx++] = 3;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}else if(sub.equals(FOUR)){
				arr[idx++] = 4;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}else if(sub.equals(FIVE)){
				arr[idx++] = 5;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}else if(sub.equals(SIX)){
				arr[idx++] = 6;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}else if(sub.equals(SEVEN)){
				arr[idx++] = 7;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}else if(sub.equals(EIGHT)){
				arr[idx++] = 8;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}else if(sub.equals(NINE)){
				arr[idx++] = 9;
				System.out.println(j);
				j = j+6;
				ifIn = true;
			}
		
		}
		
		return true;
	}
}

코드를 보니 괜히 public static 으로 0~9에 해당하는 문자열을 저장해서 코드가 많이 길어졌던 것 같다. 공통된 점을 찾지 못해서 저렇게 밖에 작성할 수 없었는데, 다시 생각해보니 charArr라는 이름의 배열을 선언해서 ONE~NINE 문자열을 넣으면 되었을 것 같다.



다른 코드도 참고

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);
		}
	}
}

0개의 댓글