반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [SW expert Academy] SWEA 1979번 어디에 단어가 들어갈 수 있을까 자바(Java)

1) 난이도 : D2

 

2) 문제번호 : 1979번

 

3) 문제 출처

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

 

SW Expert Academy

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

swexpertacademy.com

 

2. 문제

N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다.

주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작성하라.

[예제]

N = 5, K = 3 이고, 퍼즐의 모양이 아래 그림과 같이 주어졌을 때


길이가 3 인 단어가 들어갈 수 있는 자리는 2 곳(가로 1번, 가로 4번)이 된다.
 

3. 제약사항

- N은 5 이상 15 이하의 정수이다. (5 ≤ N ≤ 15)

- K는 2 이상 N 이하의 정수이다. (2 ≤ K ≤ N)

 

4. 입력

입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.

다음 줄부터 각 테스트 케이스가 주어진다.

테스트 케이스의 첫 번째 줄에는 단어 퍼즐의 가로, 세로 길이 N 과, 단어의 길이 K 가 주어진다.

테스트 케이스의 두 번째 줄부터 퍼즐의 모양이 2차원 정보로 주어진다.

퍼즐의 각 셀 중, 흰색 부분은 1, 검은색 부분은 0 으로 주어진다.

 

5. 출력

테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

6. 풀이

- 배열을 입력받을 때, N+2만큼의 배열로 선언해서 배열 테두리에 0으로 가둬서 문제를 풀었다.

- 행과 열을 나눠 확인을 했는데, 먼저 행을 확인하고, 그 다음 열을 확인하여 갯수를 누적시켰다.

- 시작 배열이 0일 때, 그 다음 배열의 값이 1이면 count를 1 증가하고, 다음 배열도 1일 때, 1증가를 한다.

- 그리고 나서, 1일 때 0이 나오면 count가 K면 개수를 증가하고, count를 0으로 초기화해서 구하면 된다.

7. 소스 코드

import java.util.*;

public class Solution {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//테스트 케이스 개수
		int T = sc.nextInt();
		
		for(int tc=1;tc<=T;tc++) {
			int N = sc.nextInt(); //가로 세로 크기
			int K = sc.nextInt(); //단어 길이
			int ans = 0; //답
			int[][] arr2 = new int[N+2][N+2];
			
			//퍼즐판 입력
			//1은 흰색 부분, 0은 검은색 부분
			//흰색 부분에 들어가야 함.
			for(int i=1;i<=N;i++)
				for(int j=1;j<=N;j++) 
					arr2[i][j] = sc.nextInt();
			
			//배열 입력 확인
//			for(int i=0;i<N+2;i++) {
//				for(int j=0;j<N+2;j++) {
//					System.out.print(arr2[i][j]);
//				}
//				System.out.println();
//			}
			
			//행 확인
			for(int i=0;i<N+2;i++) {
				int count = 0; //1의 개수
				for(int j=0;j<N+1;j++) {
					//0일 때 
					if(arr2[i][j]==0) {
						//오른쪽 값이 1이라면 count 1 증가
						if(arr2[i][j+1]!=arr2[i][j]) count++;
					}
					
					else {
						//1일 때 오른쪽 값이 같으면 count 1 증가
						if(arr2[i][j+1]==arr2[i][j]) count++;
						//count가 3이면 ans 1 증가
						//오른쪽 값이 다르면 count 0으로 초기화
						else {
							if(count==K) ans++;
							count=0;
						}
					}
				}
				
				//1의 개수가 K개와 같으면 ans 1씩 증가
				
				if(count==K) {
					ans++;
				}
			}
			
			//열 확인
			for(int i=0;i<N+2;i++) {
				int count = 0; //1의 개수
				for(int j=0;j<N+1;j++) {
					//0일 때 
					if(arr2[j][i]==0) {
						//아래 값이 1이라면 count 1 증가
						if(arr2[j+1][i]!=arr2[j][i]) count++;
					}
					
					else {
						//1일 때 아래 값이 같으면 count 1 증가
						if(arr2[j+1][i]==arr2[j][i]) count++;
						//count가 3이면 ans 1 증가
						//아래 값이 다르면 count 0으로 초기화
						else {
							if(count==K) ans++;
							count=0;
						}
					}
				}
				
				if(count==K) ans++;
			}
			System.out.printf("#%d %d\n",tc,ans);
		}		
	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기