이번 문제는 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 |
댓글