Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 맵
- 그래프
- 문자열
- 누적 합
- 구현
- Python
- 정수론
- boj
- 투 포인터
- 이분 탐색
- 그리디
- 13164
- 싸피
- 정렬
- 세그먼트 트리
- 브루트포스
- 슬라이딩 윈도우
- 2357
- 해시 테이블
- JavaScript
- 모던 JavaScript 튜토리얼
- 플로이드-워셜
- 에라토스테네스의 체
- BFS
- DP
- DFS
- 애드 혹
- 수학
- SSAFY
- 트리
Archives
- Today
- Total
흙금이네 블로그
[BOJ] 18429 - 근손실 (Python, JavaScript) 본문
아이디어
DFS로 가능한 순열 순서를 탐색하되, 백트래킹으로 중간에 500 미만이 되는 순서는 더 탐색하지 않는다.
풀이 #1 (Python)
운동 키트 중량 증가량을 리스트 A에 저장하고, 방문 표시를 위해 리스트 visited를 생성한 후 함수 dfs를 호출한다.
함수 dfs에서는 사용하지 않은 운동 키트들에 대해 visited에 표시한 후, 재귀 호출로 중량 total을 갱신하며 탐색해 나간다.
중간에 중량이 500 미만이 되면 현재 탐색을 종료하고 되돌아가고, 운동 일수 day가 N이 되면 결과값 res를 1 증가시킨다.
def dfs(day, total):
global res
if total < 500:
return
if day >= N:
res += 1
return
for i in range(N):
if visited[i] == 0:
visited[i] = 1
dfs(day+1, total+A[i]-K)
visited[i] = 0
N, K = map(int, input().split())
A = list(map(int, input().split()))
visited = [0]*N
res = 0
dfs(0, 500)
print(res)
풀이 #2 (Python)
풀이 #1에서 매일 중량이 K만큼 감소하더라도 마지막 날까지 500 미만이 되지 않는 경우를 백트래킹으로 처리한다.
함수 dfs에서 현재 중량에서 남은 일수에 K를 곱한 값을 빼도 500 이상인 경우,
남은 일수에 대해서는 순열로 가능한 경우의 수(남은 일수가 n일 때 n!)를 temp에 계산하여 결과값 res에 더한다.
만약 day가 N이 되었을 때는 for문이 실행되지 않아 temp에 저장된 1을 그대로 더한다.
def dfs(day, total):
global res
if total < 500:
return
if total-(N-day)*K >= 500:
temp = 1
for i in range(1, N-day+1):
temp *= i
res += temp
return
for i in range(N):
if visited[i] == 0:
visited[i] = 1
dfs(day+1, total+A[i]-K)
visited[i] = 0
N, K = map(int, input().split())
A = list(map(int, input().split()))
visited = [0]*N
res = 0
dfs(0, 500)
print(res)
풀이 #3 (JavaScript)
풀이 #2와 같은 방식으로 동작하며, 함수 dfs 내에서 global.res로 결과값 res의 전역 변수 선언을 할 수 있었다.
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
function dfs(day, total) {
global.res;
if (total < 500) return
if (total-(N-day)*K >= 500) {
let temp = 1;
for (let i=1; i<N-day+1; i++) temp *= i;
res += temp;
return
}
for (let i=0; i<N; i++) {
if (visited[i] === 0) {
visited[i] = 1;
dfs(day+1, total+A[i]-K);
visited[i] = 0;
}
}
}
const [N, K] = input[0].split(' ').map(Number);
const A = input[1].split(' ').map(Number);
let visited = Array(N).fill(0);
let res = 0;
dfs(0, 500);
console.log(res);
'알고리즘' 카테고리의 다른 글
[BOJ] 15658 - 연산자 끼워넣기 (2) (Python, JavaScript) (0) | 2023.02.07 |
---|---|
[BOJ] 2011 - 암호코드 (Python) (0) | 2023.02.07 |
[BOJ] 2096 - 내려가기 (Python) (0) | 2023.02.05 |
[BOJ] 1377 - 버블 소트 (Python) (0) | 2023.02.05 |
[BOJ] 21278 - 호석이 두 마리 치킨 (Python, JavaScript) (0) | 2023.02.05 |
Comments