일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- HTML
- border radius
- 생활코딩 WEB2-JavaScript
- box-sizing: border-box
- git 버전관리
- error: ENOENT: no such file or directory
- 단계별로 풀어보기
- WEB2-JavaScript
- max-width
- 라매개발자
- 백준 자바스크립트
- :root
- 백준
- 생활코딩
- 코딩테스트
- 노마드 코더
- Pull
- 드림코딩
- html 끝
- nav태그
- li 태그
- git
- calc()
- 크롬웹
- 나도코딩
- button:focus cursor: pointer; outline: none;
- 나도코딩 파이썬
- 할만한데?
- 백준 정리
- margin 0 auto
- Today
- Total
코딩응애의 개발블로그
백준 1780번 본문
이것도 재귀문제 일단 코드부터 보자면
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(__dirname + '/input.txt').toString().split('\n')
const testcase = [];
for (let i = 1; i <= +input[0]; i++) {
testcase.push(input[i].split(' ').map(value => +value));
}
const cnt = [0, 0, 0]; // 각각 -1,0,1 종이의 개수가 들어갈 배열
solution(0, 0, +input[0]);
function solution(r, c, N) {
const first = testcase[r][c]; // 다른 수들과 비교를 할 처음 수
let numCnt = 0;
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
if (testcase[r + i][c + j] === first) { // 처음수와 다른 수가 같을때
numCnt++;
}
else {
break;
}
}
}
if (numCnt === N * N) {
cnt[first + 1]++;
}
else {
N /= 3;
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
solution(r + i * N, c + j * N, N)
}
}
}
}
console.log(cnt.join("\n"));
일단 내 스스로는 못풀어서 다른 사람들이 푼 풀이를 보고 이해를 할려고 했는데 진짜 이해하는데 역대급으로 오래 걸리지 않았나 싶을정도로 오래걸린 문제. 물론 요즘 의지가 계속 약해져서 그런거일수도 있긴한데 정말 이해하는데 힘들었다...
처음에는 입력을 받기 위한 testcase 선언을 해주고 난뒤 const cnt = [0,0,0]은 -1,0,1 일때 종이 개수를 나타내 주는 배열 선언 해준다. 이 문제가 N*N 행렬로 이뤄진 종이의 같은 숫자만 있어야 해당숫자 개수를 1 플러스 해주는 문제인데
그러기 위해서 처음 비교해줄수를 선언을 해준다
const first = testcase[r][c];
그러고 for문을 돌면서 만약 처음 수와 다른 수가 같다면 미리 선언을 해둔 변수에 플러스 1을 해주고 아니라면
break 해준다 그렇게 for문을 다 돌고 나서 if문을 도는데 이부분이 제일 이해 안갔음
if (numCnt === N * N) {
cnt[first + 1]++;
}
일단 저 조건식이 무엇을 뜻하냐면 처음 수와 다른 수가 같을때마다 플러스를 해준 변수 numCnt가 N*N과 같다는 의미가
결국에는 N*N의 행렬 안에 있는 모든 수와 같아야 N*N(개수)과 같기 때문에 해당 수로만 이루어진 종이가 된다는 의미
그래서 해당수를 플러스 해줘야 하는데 왜 cnt[first+1]++ 이냐면 예를 들어서 first가 0이라고 가정하면
위에서 선언을 한 const cnt = [0,0,0] 로 인해서 cnt[1]을 플러스 해줘야 하는데 cnt[first]++ 이라고만 해주면
cnt[0]을 플러스 해주는거라 안 맞아서 cnt[first+1]++ 로 해주는 것이다.
그게 아니라면 종이를 9개로 자르고 위 과정을 반복을 해야 하니까 9개로 나눠주려면 N을 3으로 나눠줘야 한다
for문 돌고 재귀로 다시 위 과정 반복해주다가 N이 1이 되면 자동으로 for문을 못도니까 종료하고 콘솔문에 의해서
답 출력하게 된다.
이와 비슷한 문제가 몇개 있다고 하니 풀면서 재귀 문제 감을 점점 가졌으면 좋겠다..