본문 바로가기
2024-?학기 ???/Solving

SWEA 1240_단순 2진 암호코드

by 껐다 켜보셨어요? 2024. 2. 26.

이번 문제는 TC 먼저

왜냐면

2
16 80
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000011101101100010111011011000101100010001101001001101110110000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
11 70
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000001100101000110100011010111101101110010011001001101110110000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000

TC가 거지같음 ㅋ

저 암호 코드가 있는 부분을 어떻게 분리하느냐

가 1차 관건. 암호 코드가 꼭 배열의 가운데에 있다거나 어떤 규칙성을 가지는 위치에 있는 것도 아니다.

그랬다면 편했겠지만 .. ㅡㅡ

 

그리고 사실 암호 코드가 ? 내가 제대로 이해한 게 맞다면

2차원 배열을 굳이 쓸 게 아니고

한 줄만 필요할 것 같다. 바코드처럼 얘가 중간에 틀어지지 않고 열을 잘 맞추고 있음

 

암호 코드를 뽑아내기 위해 알아두어야 할 것들.

1) 코드는 이진수 형태의 7자리로 이루어진 수가 n개 이루어진 형태(7자리씩 잘라야 함, 즉 잘라낸 것의 길이가 7n이어야 함)

2) 0~9를 나타내는 암호 코드는 모두 맨 앞이 0이라는 점

3) 0~9를 나타내는 암호 코드는 모두 맨 뒤가 1이라는 점

 

내가 지금 contains를 쓸까 말까 고민 중인데

API 쓰기가 자존심 상함 

어차피 보기에만 편한 거지 내부로는 연산 졸라 돌 텐데

 

그래서 방금 전에 

import java.util.Arrays;
import java.util.Scanner;

class Idxes{
	int start;
	int end;
	Idxes(int start, int end){
		this.start = start;
		this.end = end;
	}
	
	void setStart(int start){
		this.start = start;
	}
}

public class Solution {
	
	public static int loop = 0;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		loop = sc.nextInt();
		for(int i = 0; i<loop; i++) {
			int r = sc.nextInt(); // 주어진 TC의 row
			int c = sc.nextInt(); // 쓰이지 않을 수도 있음.
			for(int j = 0; j<r; j++) {
				char[] thisLine = sc.next().toCharArray();
				if(isContains(thisLine)) { // 코드를 찾았다.
					Idxes bothEnd = find1(thisLine);
					
					int addSize = (bothEnd.end - bothEnd.start) % 7; // 바코드를 만들기 위해 더해야 할 수
					if(addSize != 0) {
						bothEnd.setStart(bothEnd.start-(6-addSize)); // 모자란 수만큼 앞으로 당긴다.
					}
					
					for(int k = bothEnd.start; k<=bothEnd.end; k++) {
						System.out.print(thisLine[k] + " ");
					}
					System.out.println();
					
				} // if isContains(thisLine)
			} // for int j
		} // for int i
	}
	
	public static boolean isContains(char[] arr) {
		int sum = 0;
		for(int i : arr) { // 이 라인의 숫자 총합이 0을 초과하는지 아닌지
			sum+=i-48;
		}
		return sum == 0 ? false : true;
	}
	
	public static Idxes find1(char[] arr) {
		int start = arr.length;
		int end = 0;
		
		for(int i = 0; i<arr.length; i++) { // 앞에서부터 탐색
			if(arr[i] == '1') {
				start = i;
				break;
			}
		} // from start search
		
		for(int i = arr.length-1; i>=0; i--) { // 뒤에서부터 탐색
			if(arr[i] == '1') {
				end = i;
				break;
			}
		} // from back search
		
		return new Idxes(start, end);
	}

}

코드 뽑아내는 로직을 짰다. 

 

남은 로직은 언젠가 이어짐 

 

import java.util.Arrays;
import java.util.Scanner;

class Idxes{
	int start;
	int end;
	Idxes(int start, int end){
		this.start = start;
		this.end = end;
	}
	
	void setStart(int start){
		this.start = start;
	}
}

public class Solution {
	
	public static int loop = 0;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		loop = sc.nextInt();
		for(int i = 0; i<loop; i++) {
			int r = sc.nextInt(); // 주어진 TC의 row
			int c = sc.nextInt(); // 쓰이지 않을 수도 있음.
			char[] arrLine = null;
			for(int j = 0; j<r; j++) {
				char[] thisLine = sc.next().toCharArray();
				if(isContains(thisLine)) { // 코드를 찾았다.
					arrLine = thisLine;
					break;
				} // if isContains(thisLine)
			} // for int j
			
			Idxes bothEnd = find1(arrLine);
			int addSize = (bothEnd.end+1 - bothEnd.start) % 7; // 바코드를 만들기 위해 더해야 할 수
			bothEnd.setStart(bothEnd.start-(7-addSize)); // 모자란 수만큼 앞으로 당긴다.
			
			char[] codeLine = new char[bothEnd.end+1 - bothEnd.start];
			for(int k = bothEnd.start; k<=bothEnd.end; k++) { 
				
				// err occurs 
				int l = 0;
				codeLine[l] = arrLine[k];
				l++;
				// =========err
			}

			System.out.println(Arrays.toString(codeLine));
		} // for int i
	}
	
	public static boolean isContains(char[] arr) {
		int sum = 0;
		for(int i : arr) { // 이 라인의 숫자 총합이 0을 초과하는지 아닌지
			sum+=i-48;
		}
		return sum == 0 ? false : true;
	}
	
	public static Idxes find1(char[] arr) {
		int start = arr.length;
		int end = 0;
		
		for(int i = 0; i<arr.length; i++) { // 앞에서부터 탐색
			if(arr[i] == '1') {
				start = i;
				break;
			}
		} // from start search
		
		for(int i = arr.length-1; i>=0; i--) { // 뒤에서부터 탐색
			if(arr[i] == '1') {
				end = i;
				break;
			}
		} // from back search
		
		return new Idxes(start, end);
	}

}

코드 여기까지 짬 

'2024-?학기 ??? > Solving' 카테고리의 다른 글

SWEA 2817_부분 수열의 합  (1) 2024.02.27
SWEA 2817_부분 수열의 합(재귀)  (0) 2024.02.27
SWEA 1959_두 개의 문자열  (1) 2024.02.25
BOJ 5397_키로거  (0) 2024.02.21
SWEA 2389_원재의 메모리 복구하기  (0) 2024.02.16

댓글