오늘은 백준 누울 자리를 search 해보는 문제를 풀도록 해보자
알바? 회사에서 몰래 푸는 문제라 더 재밌었던건 안비밀이다.
실버5 문제이다
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);
}
}