누울 자리를 찾아라

문제

언어

  • JavaScript

순서도

  1. 위에서부터 아래로 내려가며 한 줄에 연속해서 2 칸 이상의 빈칸의 경우 세기
  2. 왼쪽부터 오른쪽으로 가며 한 줄에 연속해서 2 칸 이상의 빈칸의 경우 세기
  3. 가로로 누울 수 있는 경우의 개수와 세로로 누울 수 있는 경우의 개수 출력

문제 풀이 step 1

  • N x N 크기의 방이 주어지는데 그 방에는 옮길 수 없는 짐이 놓여있습니다. 영식이가 방에서 잘 수 있게 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리를 세서 출력해줍시다.
  • 우선, 가로로 누울 수 있는 자리를 먼저 셉니다.
    • 위에서부터 아래로 내려가며 한 줄씩 검사합니다.
    • 한 줄에 똑바로 연속해서 2 칸 이상의 빈칸이 존재하면 누울 수 있는 자리로 간주하고 개수를 세어줍니다.
  • 그리고 세로로 누울 수 있는 자리를 셉니다.
    • 왼쪽부터 오른쪽으로 가며 한 줄씩 검사합니다.
    • 한 줄에 똑바로 연속해서 2 칸 이상의 빈칸이 존재하면 누울 수 있는 자리로 간주하고 개수를 세어줍니다.
  • 위 과정을 통해서 구한 가로로 누울 수 있는 자리의 개수와 세로로 누울 수 있는 자리의 개수를 출력합니다.

소스 코드

const input = require("fs")
	.readFileSync("/dev/stdin")
	.toString()
	.trim()
	.split("\n");

const solution = (input) => {
	const n = Number(input[0]);
	const room = input.slice(1, n + 1).map((v) => v.split(""));

	let horizontal = 0;
	let vertical = 0;
	// 한 줄씩 검사
	for (let i = 0; i < n; i++) {
		// 세로로 누울 수 있는 경우 세기
		let empty = 0;
		for (let j = 0; j < n; j++) {
			// 빈 칸이면 empty 증가
			if (room[i][j] === ".") empty += 1;
			// 짐이면 빈칸이 2 이상인지 검사
			if (room[i][j] === "X") {
				if (empty >= 2) horizontal += 1;
				empty = 0;
			}
		}
		// 한 줄을 다 검사했을 때 빈칸이 2 이상인지 검사
		if (empty >= 2) horizontal += 1;

		// 가로로 누울 수 있는 경우도 위와 마찬가지로 동작
		empty = 0;
		for (let j = 0; j < n; j++) {
			if (room[j][i] === ".") empty += 1;
			if (room[j][i] === "X") {
				if (empty >= 2) vertical += 1;
				empty = 0;
			}
		}
		if (empty >= 2) vertical += 1;
	}

	return `${horizontal} ${vertical}`;
};

console.log(solution(input));