SWEA

[SWEA] 어디에 단어가 들어갈 수 있을까 (+오답)

itsnot4me 2024. 10. 15. 01:11

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PuPq6AaQDFAUq&categoryId=AV5PuPq6AaQDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=2

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

(오답)

import java.util.Scanner;
import java.io.FileInputStream;


class Solution
{
	public static void main(String args[]) throws Exception
	{
        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 K = sc.nextInt();
            int count =0;
            String[][] arr1 = new String[N][N];
            String[][] arr2 = new String[N][N];
            String check1="";
            String check2="";
            String[] answer = new String[1];
            answer[0] = "";
            for(int num =0; num<K; num++){ // 1의 개수 설정
                answer[0] += "1";
            }
            
            for(int i=0; i<N; i++){               // 2차원 배열에 가로, 세로 뒤집힌 버전으로 1, 2 설정
                for(int j=0; j<N; j++){
                    arr1[i][j] = sc.next();
                    arr2[j][i] = arr1[i][j];                   
                }               
        }
            
            for(int k=0; k<N; k++){
                check1 = ""; // check1, check2를 공백으로 설정
                check2 = "";
                
                
                for(int l=0; l<N; l++){
                 check1+= arr1[k][l]; // check1, 2에 가로-세로 따로 1열씩 입력 ex) 첫번째의 경우 가로 1열, 세로 1열 입력됨, 0부터 N-1번째까지 다 입력됨
                 check2+= arr2[k][l];
               }
                
                
                String[] ex1 = check1.split("0"); // 이 이하, 입력된 한줄을 체크해서 0 사이 1의 개수 split으로 추출
                String[] ex2 = check2.split("0");
                
                for(int a = 0; a<ex1.length; a++){ //  split 0으로 나눠진 배열의 개수만큼 체크
                if(ex1[a]==answer[0])
                    count++; 
                }        
                
                 for(int b = 0; b<ex2.length; b++){
                if(ex2[b]==answer[0])
                    count++;                
                 }
                 
			}
            Sysetm.out.println("#" + test_case + " " + count);
           }                      
	}
  }

 

1. 문자열 비교할때는 주솟값이 다르게 불러와지기때문에 if문으로 같냐고하면 풀 수 없다 그거 모르고 왜 배열끼리 비교하라고 하지?  answer을 배열로 선언한 이유였고, 도대체 뭐가 문제지 하면서 따로 창 켜서 if문 돌려보면서 이건 true로 나오고 이건 false로 나오는데 이유가 뭐지 하면서 다시 했다.

 

해결법 > 비교함수, 예시로 a.equlas(b) 사용하면 된다.

 

2. 다시 보니 arr1, 2 따로 받을 필요 없고 발상을 했으니 정상구조 1개만 생성하고 그걸 세로로 가로로 따로 받아서 문자열 만들면 됨

 

 

(정답)

import java.util.Scanner;
import java.io.FileInputStream;


class Solution
{
	public static void main(String args[]) throws Exception
	{
		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 K = sc.nextInt();
            int count =0;
            String[][] arr1 = new String[N][N];
            String check1="";
            String check2="";
            String answer = "";

            for(int num =0; num<K; num++){ // 1의 개수 설정
                answer += "1";
            }
            
            for(int i=0; i<N; i++){
                for(int j=0; j<N; j++){
                    arr1[i][j] = sc.next();           
                }               
        }
            
            for(int k=0; k<N; k++){
                check1 = ""; // check1, check2를 공백으로 설정
                check2 = "";
                
                
                for(int l=0; l<N; l++){
                 check1+= arr1[k][l]; // check1, 2에 가로-세로 따로 1열씩 입력 ex) 첫번째의 경우 가로 1열, 세로 1열 입력됨, 0부터 N-1번째까지 다 입력됨
                 check2+= arr1[l][k];
               }
                
                
                String[] ex1 = check1.split("0"); // 이 이하, 입력된 한줄을 체크해서 0 사이 1의 개수 split으로 추출
                String[] ex2 = check2.split("0");
                
                for(int a = 0; a<ex1.length; a++){ //  split 0으로 나눠진 배열의 개수만큼 체크
                if(ex1[a].equals(answer))
                    count++; 
                }        
               
                 for(int b = 0; b<ex2.length; b++){
                if(ex2[b].equals(answer))
                    count++;                
                 }
           }
           System.out.println("#" + test_case + " " + count);
            
	}
       
}
}

 

쉽고 오래 걸릴 문제가 아니었지만 어이가 없이 오래 걸려서 아마 잊지 않을 것..

'SWEA' 카테고리의 다른 글

[SWEA] 증가하는 사탕 수열  (0) 2024.10.25
[SWEA] 공평한 분배 2  (0) 2024.10.25
[SWEA] 백만 장자 프로젝트 (+오답)  (0) 2024.10.13
[SWEA] 최빈수 구하기  (0) 2024.10.10
[SWEA] 수도 요금 경쟁  (0) 2024.10.10