반응형
백트래킹과 분할 정복
학습 주제
- 백트래킹의 개념과 활용 (N-Queen 문제, 퍼즐 문제)
- 분할 정복 알고리즘 (Merge Sort, Quick Sort 재방문, Fast Exponentiation)
학습 목표
- 백트래킹의 개념과 다양한 문제에서의 활용 방법을 이해하고 구현할 수 있다.
- 분할 정복 알고리즘의 원리를 이해하고 구현할 수 있다.
- N-Queen 문제, 퍼즐 문제 등의 대표적인 백트래킹 문제를 해결할 수 있다.
학습 자료
- 백트래킹 개요와 원리
- 분할 정복 알고리즘 설명 및 구현
실습 문제
1. N-Queen 문제 해결
- N x N 체스판에 N개의 퀸을 놓는 문제를 백트래킹을 사용하여 해결하는 함수를 작성하세요.
def is_safe(board, row, col):
for i in range(col):
if board[row][i] == 1:
return False
for i, j in zip(range(row, -1, -1), range(col, -1, -1)):
if board[i][j] == 1:
return False
for i, j in zip(range(row, len(board)), range(col, -1, -1)):
if board[i][j] == 1:
return False
return True
def solve_n_queens_util(board, col):
if col >= len(board):
return True
for i in range(len(board)):
if is_safe(board, i, col):
board[i][col] = 1
if solve_n_queens_util(board, col + 1):
return True
board[i][col] = 0
return False
def solve_n_queens(n):
board = [[0] * n for _ in range(n)]
if not solve_n_queens_util(board, 0):
return "Solution does not exist"
return board
# Test
n = 4
solution = solve_n_queens(n)
for row in solution:
print(row)
# Output:
# [0, 0, 1, 0]
# [1, 0, 0, 0]
# [0, 0, 0, 1]
# [0, 1, 0, 0]
2. 퍼즐 문제 (예: Sudoku 해결)
- 주어진 Sudoku 퍼즐을 백트래킹을 사용하여 해결하는 함수를 작성하세요.
def is_valid(board, row, col, num):
for i in range(9):
if board[row][i] == num or board[i][col] == num:
return False
start_row, start_col = 3 * (row // 3), 3 * (col // 3)
for i in range(3):
for j in range(3):
if board[i + start_row][j + start_col] == num:
return False
return True
def solve_sudoku(board):
for row in range(9):
for col in range(9):
if board[row][col] == 0:
for num in range(1, 10):
if is_valid(board, row, col, num):
board[row][col] = num
if solve_sudoku(board):
return True
board[row][col] = 0
return False
return True
# Test
sudoku_board = [
[5, 3, 0, 0, 7, 0, 0, 0, 0],
[6, 0, 0, 1, 9, 5, 0, 0, 0],
[0, 9, 8, 0, 0, 0, 0, 6, 0],
[8, 0, 0, 0, 6, 0, 0, 0, 3],
[4, 0, 0, 8, 0, 3, 0, 0, 1],
[7, 0, 0, 0, 2, 0, 0, 0, 6],
[0, 6, 0, 0, 0, 0, 2, 8, 0],
[0, 0, 0, 4, 1, 9, 0, 0, 5],
[0, 0, 0, 0, 8, 0, 0, 7, 9]
]
solve_sudoku(sudoku_board)
for row in sudoku_board:
print(row)
# Solved Sudoku board will be printed
3. 분할 정복을 사용한 큰 수의 거듭제곱 계산
- 분할 정복 알고리즘을 사용하여 큰 수의 거듭제곱을 계산하는 함수를 작성하세요.
def power(x, y):
if y == 0:
return 1
temp = power(x, y // 2)
if y % 2 == 0:
return temp * temp
else:
return x * temp * temp
# Test
x = 2
y = 10
print(f"{x}^{y} = {power(x, y)}") # 1024
추가 학습 자료:
- Backtracking - GeeksforGeeks
- Divide and Conquer - GeeksforGeeks
- N-Queens Problem - GeeksforGeeks
- Sudoku Solver - GeeksforGeeks
추천 문제
백준 (Baekjoon)
- 문제명: N-Queen
- 설명: N-Queen 문제를 해결하여, N개의 퀸이 서로 공격하지 않도록 배치하는 방법의 수를 구하는 문제입니다.
- 문제 유형: 백트래킹
- 난이도: 골드 IV
- 주소: N-Queen
- 문제명: 스도쿠
- 설명: 주어진 스도쿠 퍼즐을 백트래킹을 사용하여 해결하는 문제입니다.
- 문제 유형: 백트래킹
- 난이도: 골드 IV
- 주소: 스도쿠
- 문제명: 부분수열의 합
- 설명: 주어진 수열에서 부분수열의 합이 특정 값이 되는 경우의 수를 찾는 문제입니다.
- 문제 유형: 백트래킹
- 난이도: 실버 II
- 주소: 부분수열의 합
프로그래머스 (Programmers)
- 문제명: 여행경로
- 설명: 주어진 항공권을 모두 사용하여 방문할 수 있는 여행 경로를 찾는 문제입니다.
- 문제 유형: 백트래킹
- 난이도: 레벨 3
- 주소: 여행경로
- 문제명: 단어 변환
- 설명: 주어진 단어 목록에서 시작 단어에서 목표 단어로 변환하는 데 필요한 최소 변환 횟수를 구하는 문제입니다. (그래프 탐색 문제로 백트래킹과 유사한 구조)
- 문제 유형: 그래프 탐색 (BFS, DFS)
- 난이도: 레벨 3
- 주소: 단어 변환
- 문제명: 네트워크
- 설명: 주어진 컴퓨터 네트워크에서 연결된 네트워크의 수를 구하는 문제입니다.
- 문제 유형: 그래프 탐색 (DFS, BFS)
- 난이도: 레벨 3
- 주소: 네트워크
반응형
'-----ETC2----- > 코딩테스트' 카테고리의 다른 글
[코딩테스트] 7주차: 고급 자료구조 (0) | 2024.06.04 |
---|---|
[코딩테스트] 6주차: 탐욕 알고리즘과 최적화 (0) | 2024.06.04 |
[코딩테스트] 4주차: 트리와 이진 탐색 트리 (0) | 2024.06.04 |
[코딩테스트] 3주차: 그래프 알고리즘 (0) | 2024.06.04 |
[코딩테스트] 2주차: 동적 프로그래밍 (Dynamic Programming) (0) | 2024.06.04 |