[알고리즘.java] 누울 자리를 찾아라 키워드 : 문자열

1
post-custom-banner

오늘은 백준 누울 자리를 search 해보는 문제를 풀도록 해보자

알바? 회사에서 몰래 푸는 문제라 더 재밌었던건 안비밀이다.

실버5 문제이다

문제링크

문제

입력

출력

예제 입력 1

5
....X
..XX.
.....
.XX..
X....

문제를 해석해보자 NXN인 방이 하나 있다

그렇다면 내가 입력한 값이 방의 넓이가 되는구나 그러면 방을 하나 만들자 라고 생각했다.

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();

방 생성
char[][] place = new char[n][n];

방을 생성하였으니 이제 방 안에 입력값을 넣어보도록 하자

for (int i = 0; i < n; i++) {
            String s = sc.next();
            for (int j = 0; j < n; j++) {
                place[i][j] = s.charAt(j);
            }
        }

이제 준비물은 완벽해 졌다

요즘 나는 바로 문제를 풀어볼려고 하지 않고 메모장에 한번 입력예제를 적어보았다.

코드를 써내려가기전에 어떻게하면 될지 고민해보는 시간을 줄여주는거 같다 .

또한 회사 쉬는시간에 짬짬히 풀기에 나름 생각해본 방법이기도 하다.

( 아이패드가 고장나서 그림을 못그리는것도 있다 )

여튼 한번 메모장에 넣고 생각을해보았다.

이런 형태가 있을것이다

내가 찾아야하는건 누울 공간이다 문제를 보면 눕기 가능한 범위는 '.' 이 점이 2개 이상이여야한다.

그렇다면 내가 찾아야할 것은 세로의 눕기 가능한 공간의 횟수 + 가로의 눕기 가능한 공간의 횟수이다.

메모장 생각정리

업로드중..

 int vertical = 0;
 int horizontal = 0;

총 잘 수 있는 공간이 될 녀석들이다.

이 녀석들은 세로 와 가로의 '.'의 갯수를 세어주는 녀석들이다

int width = 0;
int hight = 0;

자 이제 조건을 다시 생각해보자

똑바로 '.'이 2개 이상 / 가로 세로 누울수있다.

난 총 2개의 거름망을 생성해야겠다고 생각했다

1. '.'일때 width의 갯수 증가
2. 값이 x 거나 or j == n-1일 경우라고 생각했다 
n-1 인 이유는 j가 숫자 인덱스가 4까지 때문이다.
3. 누울 공간이 2개 이상일때
place[i][j] = s.charAt(j);

이녀석의 세로값을 구하려면

place[i][j] 을 들어가보면 된다.

이 후 첫번째 거름망을 하나 설치해주자

만약에 세로 값에 '.' 이 있다면 
width의 값을 증가시켜주자 

만약에 가로 값에 '.' 이 있다면
hight의 값을 증가시켜주자.

이제 코드를 한번 봐보자


        for (int i = 0; i < n; i++) {
            // 몇칸 갔는지 ( ex : '.'
            int width = 0;
            int hight = 0;

            for (int j = 0; j < n; j++) {
                // 세로값구하기
                if(place[i][j] == '.'){
                    width++;
                }

여기까지 보았다면 그림판으로 그림을 그려보겠다

이렇게 될것이다

2번째 거름망을 설치해보겠다

 if(place[i][j] == 'X'  || j==n-1){
   	if(width >= 2){
           horizontal++;
         }
     width = 0;
}

or 조건에서 'X'녀석을 만나게되어 마지막 거름망으로 '.'갯수가 2보다 크거나 같으면

세로로 누을공간++ 이렇게 해준것이다.

j==n-1 
이 부분이 이해가 가지않는다면 

이 부분을 생각하면 된다.

이후 2번째 세로의 '.'갯수를 구해주기위해 width를 초기화 시켜주었다.

이제 세로가 끝났으니 가로 도 똑같은 매커니즘으로 구하면된다

코드

import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        // 장소 생성
        char[][] place = new char[n][n];

        for (int i = 0; i < n; i++) {
            String s = sc.next();
            for (int j = 0; j < n; j++) {
                place[i][j] = s.charAt(j);
            }
        }

        // 총 잘 장소가 몇개 인지
        int vertical = 0;
        int horizontal = 0;

        for (int i = 0; i < n; i++) {
            // 몇칸 갔는지 ( ex : '.'
            int width = 0;
            int hight = 0;

            for (int j = 0; j < n; j++) {
                // 세로값구하기
                if(place[i][j] == '.'){
                    width++;
                }

                if(place[i][j] == 'X'  || j==n-1){
                    if(width >= 2){
                        horizontal++;
                    }
                    width = 0;
                }

                // 가로값 구하기
                if(place[j][i] == '.'){
                    hight++;
                }

                if(place[j][i] == 'X' || j== n-1){
                    if(hight >=  2){
                        vertical++;
                    }
                    hight = 0;
                }

            }
        }

        System.out.println(horizontal + " " + vertical);

    }
}
profile
배운것을 끄적끄적 올리는 개발 블로그
post-custom-banner

0개의 댓글