일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- ubuntu
- 실전알고리즘
- pytorch
- 딥러닝
- docker
- 구현
- cs
- AWS
- C++
- 전산기초
- STL
- 파이썬
- 머신러닝
- test-helper
- 프로그래머스
- SWEA
- 모두를 위한 딥러닝 강좌 시즌1
- 그리디
- 코드수행
- CS231n
- 2단계
- MySQL
- 자료구조 및 실습
- 3단계
- 이것이 코딩테스트다 with 파이썬
- 1단계
- Object detection
- 백준
- ssd
- Python
- Today
- Total
곰퓨타의 SW 이야기
[프로그래머스 level3 N-Queen] 백트래킹 알고리즘 활용하기 본문
해결해야하는 문제는 다음과 같았다.
https://programmers.co.kr/learn/courses/30/lessons/12952
코딩테스트 연습 - N-Queen
가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은
programmers.co.kr
N-Queen 문제를 해결하기 전, 이 문제를 알고리즘 백트래킹 시간에 다루었던 기억이 나서, 백트래킹에 대해서 다시 짚어보았다.
백트래킹 알고리즘(Backtracking Algorithm)
가치지기 과정을 통해, 해를 찾아가면서 유망하지 않은 경우(non-promising)한 경우 그 경로를 더이상 탐색하지 않고 다른 경로를 탐색해나가는 방식이다.
즉, 유망하지 않다고 판단된다면 그 노드의 부모로 돌아가서 다음 자식 노드로 가는 방식으로 확인한다.
가지치기를 어떻게 하느냐에 따라 불필요한 경로를 삭제하는 가짓수가 달라지면서 경우의수가 달라진다.
책에서 제시된 수도 코드이다.
이 수도코드를 바탕으로 아이디어를 정리하면 다음과 같다.
1. col을 정의한 후, 하나씩 검사를 시작할 것이다.
def solution(n):
global answer
answer = 0
for i in range(n):
col = [i] + [0]*(n-1)
check(0,col)
return answer
2. check 함수
def check(idx,col):
global answer
n=len(col)
if promising(idx,col) :
if idx==n-1:
answer += 1
else :
for j in range(n):
col[idx+1] = j
check(idx+1,col)
3. promising 함수
def promising(idx,col):
for k in range(idx):
if (col[idx]==col[k]) or (abs(col[idx]-col[k])==idx-k) :
return False
return True
이러한 아이디어를 바탕으로 작성한 코드는 다음과 같다.
def check(idx,col):
global answer
n=len(col)
if promising(idx,col) :
if idx==n-1:
answer += 1
else :
for j in range(n):
col[idx+1] = j
check(idx+1,col)
def promising(idx,col):
for k in range(idx):
if (col[idx]==col[k]) or (abs(col[idx]-col[k])==idx-k) :
return False
return True
def solution(n):
global answer
answer = 0
for i in range(n):
col = [i] + [0]*(n-1)
check(0,col)
return answer
문제 푸는 것도 중요하지만, 현재 알고리즘 지식들이 많이 머릿속에서 흐릿해져가고 있는 것 같다..
자료구조 및 알고리즘을 공부하며 그와 관련된 예시를 푸는 방식으로 공부를 해보는 것은 어떨까 라는 생각이 머릿속을 스치는 하루였다..
⭐️
'TIL > 프로그래머스' 카테고리의 다른 글
[프로그래머스 level3 야근지수] 딕셔너리 활용하여 효율성 뿌시기 (0) | 2021.09.21 |
---|---|
[프로그래머스 level3 멀리 뛰기] 팩토리얼 활용하기 (0) | 2021.09.20 |
[프로그래머스 level3 경주로 건설] bfs 활용하기 (0) | 2021.09.10 |
[프로그래머스 level3 광고 삽입] 다이나믹 프로그래밍 활용하기 (0) | 2021.09.10 |
[프로그래머스 level3 길 찾기 게임] 이진 트리 및 전위순회, 후위순회 구현하기! (0) | 2021.09.08 |