치춘짱베리굿나이스

[백준] 2508 본문

사탕 박사 고창영

문제

창영이가 드디어 취직을 했다!! 그가 30세까지 취직을 안하던 이유는 바로 마음에 다니는 직장을 찾지 못해서였다. 이번에 창영이가 취직한 곳은 사탕 공장이다. 사탕 공장에 다니면 사탕 처럼 달콤한 직장생활을 할 줄 알았지만, 8시간동안 사탕 품질을 검사해야 하는 작업은 너무나 지루했다.

사탕의 품질은 다음과 같이 검사한다. 가장 먼저 사탕으로 가득 찬 박스를 연다. 그 다음 사탕의 개수와 사탕이 없는 곳의 개수를 센다.

지루함을 견디지 못한 창영이는 결국 품질을 검사하는 프로그램을 작성하기로 했다.

r행 c열 행렬이 주어진다. 이 행렬은 박스를 위에서 바라본 것이다. 행렬에는 다음과 같은 문자만 있다.

  • ".": 빈 곳
  • "o": 사탕의 먹을 수 있는 부분
  • "<>v^": 캔디 껍질

사탕은 오직 2가지 모습만 있다.

>o<
v
o
^

위와 같은 연속된 3개의 문자만 사탕이다.

사탕은 >o.와 같이 사탕의 일부만 존재할 수 있지만, 이 것은 사탕으로 세지 않는다.

r행 c열 행렬이 주어졌을 때, 사탕의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 t가 주어진다. 각 테스트 케이스는 빈 줄로 구분된다.

각 테스트 케이스의 첫째 줄에는 r과 c 가 주어진다. (1 ≤ r,c ≤ 400) 그 다음 r개의 줄에는 행렬의 각 행이 순서대로 주어진다. 행렬의 각 행은 c개의 문자이며, ".o<>v^"만 포함하고 있다. (각각의 아스키 값은 46, 111, 60, 62, 118, 94이다)

출력

각각의 테스트 케이스에 대해 한 줄에 하나의 정수만 출력한다. 이 값은 박스에 들어있는 사탕의 개수이다.

풀이

const candy = () => {
  const [n, ...arr] = require("fs")
    .readFileSync("/dev/stdin")
    .toString()
    .trim()
    .split("\n");
  let curRow = 0;
  let cnt;

  for (let i = 0; i < n; i++) {
    cnt = 0;
    let [r, c] = arr[++curRow].split(" ").map(Number);
    curRow++;
    for (let j = curRow; j < curRow + r - 2; j++) {
      for (let k = 0; k < c; k++) {
        if (arr[j][k] === "v" && arr[j + 1][k] === "o" && arr[j + 2][k] === "^")
          cnt++;
      }
    }

    for (let k = 0; k < c - 2; k++) {
      for (let j = curRow; j < curRow + r; j++) {
        if (arr[j][k] === ">" && arr[j][k + 1] === "o" && arr[j][k + 2] === "<")
          cnt++;
      }
    }
    curRow += r;
    console.log(cnt);
  }
};

candy();

반성회

이게 최선인진 모르겠지만 매 줄마다 하나하나씩 세주었다

'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글

[백준] 1543  (0) 2023.08.28
[백준] 10815  (0) 2023.07.30
[백준] 2890  (0) 2023.07.26
[백준] 27889  (0) 2023.07.21
[백준] 5524  (0) 2023.07.20
Comments