[백준][ts/js] 1018: 체스판 다시 칠하기

Pyotato·2023년 5월 15일
0

[백준][js/ts]

목록 보기
6/21

로직

logic

  • 체스판입력값은 W와 B로 되어있지만 보기 편하게 입력값을 B=0, W=1로 변경
  • 체스판은 8x8이고 01 01 01 01 로 시작되거나 10 10 10 10 로 칠해져야함
  • 체스판의 넓이가 8x8 일때는 두 경우 중 바꿔칠해야하는 경우가 최소가 되는 경우를 구하면됨
  • 바꿔칠해야하는 것의 여부는 이중 for문을 돌리면 된다.
    • 0으로 시작하는 경우
      • 바깥 for문이 짝수 행일 때 안쪽 for문의 짝수 열이 0이어야하고 홀수 열이 1이어야함
      • 아닌 경우 count 변수에 +1해준다
    • 1로 시작하는 경우는 위의 경우의 반대이다.
  • count변수는 바꿔줘야하는 경우의 합이므로
  • 합들을 배열에 담아서 그 중 가장 최소를 답으로 리턴한다.
  • 체스판의 넓이는 8x8로 고정되어 있다.
  • for문을 돌아주면서 8x8으로 체스판을 짤라주면서
  • 마찬가지로 합들을 담은 배열의 최소가 답이 된다.

풀이

//https://www.acmicpc.net/problem/![](https://velog.velcdn.com/images/pyotato/post/d5a1ccc7-3166-4700-a209-43a32f0f1842/image.png)

{
  const board_size: string | null = prompt("체스판의 크기 N,M을 입력해주세요");
  const N: number = board_size ? parseInt(board_size.split(" ")[0]) : 0;
  const M: number = board_size ? parseInt(board_size.split(" ")[1]) : 0;

  if (N >= 8 && N <= 50) {
    const chess: Array<Array<number>> = [];
    for (let i = 0; i < N; i++) {
      const row = prompt(
        `${i + 1}번째 줄에 해당되는 체스판색들을 입력해주세요`
      );
      if (row && row.length != M) {
        console.log(
          `${i + 1}번째 줄에 해당되는 체스판 색의 개수가 부족합니다.`
        );
        break;
      } else {
        if (row) {
          row.includes("B") ||
            (row.includes("W") &&
              chess.push(row.split("").map((v) => (v == "B" ? 1 : 0))));
        } else {
          console.log(`${i + 1}번째 줄에 해당되는 체스판 색이 부적절합니다.`);
        }
      }
    }
    console.log(chess);
    //체스판 순회하면서 0시작 1시작 조건으로 바뀌는 수 구하기
    const c_start = (
      n: number,
      m: number,
      start: number,
      end: number
    ): number => {
      let count: number = 0;
      for (let i = n; i < n + 8; i++) {
        if (i % 2 === 0) {
          //짝수행
          for (let j = m; j < m + 8; j++) {
            if (j % 2 === 0) {
              chess[i][j] === start ? (count = count + 1) : count;
            } else {
              chess[i][j] === end ? (count = count + 1) : count;
            }
          }
        } else {
          //홀수행
          for (let j = m; j < m + 8; j++) {
            if (j % 2 === 0) {
              chess[i][j] === end ? (count = count + 1) : count;
            } else {
              chess[i][j] === start ? (count = count + 1) : count;
            }
          }
        }
      }

      return count;
    };

    //체스판 8X8크기로 짜르면서 최소 바꾼 횟수를 배열에 넣어 배열 최소를 리
    const clr_board = (n: number, m: number): number => {
      const ans: Array<number> = [];
      for (let i = 0; i < N - 7; i++) {
        for (let j = 0; j < M - 7; j++) {
          ans.push(c_start(i, j, 0, 1));
          ans.push(c_start(i, j, 1, 0));
        }
      }
      return Math.min(...ans);
    };
    console.log(clr_board(N, M));
  } else {
    console.log("체스판 크기 입력값이 부적절합니다.");
  }
}
/*

* test1
8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW

result: 1

---

* test3
8 8
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB

result: 0
---

* test2
10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB

result: 12
---

* test2
10 10
BBBBBBBBBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBBBBBBBBB
result: 0

---

* test2
9 23
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBW

result: 31

---

10 10
BBBBBBBBBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBBBBBBBBB

result : 0
--

* test2

8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWWWB
BWBWBWBW

result: 2 

---

* test2
11 12
BWWBWWBWWBWW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBWWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW

result: 15


*/

profile
https://pyotato-dev.tistory.com/ 로 이사중 🚚💨🚛💨🚚💨

0개의 댓글