일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- DP
- 그리디 알고리즘
- BASIC
- 구현
- 그래프 이론
- 그래프이론
- 프로그래머스스쿨
- DFS
- 파이썬
- 정렬
- BFS
- CSS
- lv2
- 딕셔너리
- 문자열
- 스택
- 브루트포스 알고리즘
- web
- 다이나믹 프로그래밍
- 알고리즘
- 그래프 탐색
- 백준
- 자바스크립트
- 프로그래머스
- JavaScript
- level2
- 너비 우선 탐색
- 자료구조
- programmers
- 웹 프론트엔드
Archives
- Today
- Total
DevLog:-)
[프로그래머스][JavaScript]N-Queen 본문
반응형
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2차원 배열 코드
function solution(n) {
let answer = 0;
// 체스판을 2차원 배열로 초기화
const board = Array.from( Array(n), () => Array(n).fill(0));
// 해당 위치에 퀸을 놓을 수 있는지 확인하는 함수
function isSafe(row, col) {
// 같은 열을 확인
for (let i = 0; i < row; i++) {
if (board[i][col] === 1) {
return false;
}
}
// 왼쪽 위 대각선 확인
for (let i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] === 1) {
return false;
}
}
// 오른쪽 위 대각선 확인
for (let i = row, j = col; i >= 0 && j < n; i--, j++) {
if (board[i][j] === 1) {
return false;
}
}
return true;
}
// 퀸을 배치하는 함수 (백트래킹)
function placeQueens(row) {
if (row === n) {
// 모든 퀸을 성공적으로 배치한 경우
answer++;
return;
}
for (let col = 0; col < n; col++) {
if (isSafe(row, col)) {
// 현재 위치에 퀸을 놓을 수 있다면
board[row][col] = 1; // 퀸을 놓고
placeQueens(row + 1); // 다음 행으로 이동
board[row][col] = 0; // 백트래킹: 다른 경우를 위해 퀸을 제거
}
}
}
// 첫 번째 행부터 시작
placeQueens(0);
return answer;
}
2차원 배열을 사용해 구현한 코드이다. 행을 기준으로 열, 대각선을 각각 검사하게 되는데
1차원 배열로도 구현이 가능하다.
1차원 배열을 통해 적은 비용으로 가지치기를 해보자.
- 배열의 index: 행의 위치, 해당 index의 value : 열의 위치
- index 하나에 여러 value를 둘 수 없다. -> 행 가지치기
- index가 같다면 둘 수 없다. -> 열 가지치기
- 행과 열에 대한 차가 같다면 대각선에 있다는 것이다. -> 대각선 가지치기
1차원 배열 코드
function check(queen, row) {
// 이전까지 두었던 퀸의 위치를 확인
for (let i = 0; i < row; i += 1) {
// 행의 위치와 대각선의 위치를 체크
if (queen[i] === queen[row] || Math.abs(queen[i] - queen[row]) === row - i) {
return false; // 둘 수 없다면 false
}
}
return true; // 모두 통과되면 true
}
function search(queen, row) {
const n = queen.length;
let count = 0;
if (n === row) { // 체스판 끝에 도달했을때가 재귀의 탈출 조건
return 1;
}
for (let col = 0; col < n; col += 1) { // 0부터 n까지 열을 돌면 둘 수 있다.
queen[row] = col; // 우선 퀸을 둔다
if (check(queen, row)) { // 퀸을 둘 수 있다면
count += search(queen, row + 1); // 다음 행으로 이동
}
}
return count;
}
function solution(n) {
// 미리 n개 만큼의 배열을 초기화,0번 행부터 시작
return search(Array.from({ length: n }, () => 0), 0);
}
✅check point!
이중 배열 선언하기 | arr = Array.from( Array(n), () => Array(n).fill(0)); arr = Array.from({ length: n }, () => Array(n).fill(0)) |
Math.abs() | 절댓값 반환 |
💡idea 요약
백트래킹 |
|
문제 속 가지치기 조건 |
|
1차원 배열 구현 | 최소한 의 비용으로 가지치기 가능
|
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][JavaScript]입국심사 (0) | 2023.09.27 |
---|---|
[프로그래머스][JavaScript]베스트앨범 (0) | 2023.09.25 |
[프로그래머스][JavaScript]올바른 괄호 (1) | 2023.09.06 |
[프로그래머스][Javascript]구명보트 (0) | 2023.08.27 |
[프로그래머스][Javascript]카펫 (0) | 2023.08.21 |