Skip to content

Commit 1cbc9eb

Browse files
authored
[Bona1122] 25.02.27 (#52)
* NM1 / 기초 * NM2 / 기초 * NM3 / 기초 * NM4 / 기초 * Subsequence Sum / 중급 * Lotto / 중급 * Operator insertion / 중급 * N-Queen / 심화 * Prime finding / 심화 * Archery competition / 심화
1 parent bfaab40 commit 1cbc9eb

File tree

17 files changed

+380
-0
lines changed

17 files changed

+380
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// https://school.programmers.co.kr/learn/courses/30/lessons/92342
2+
// 핵심은 1. 각 점수에 대해 이길지 말지를 결정하는 것
3+
// 2. 이길 때, 최소한의 화살 사용하기 - 어피치보다 1개만 더 쏘면됨. => 최고점수 만들기 위해 화살 효율적 사용, 그리고 낮은점수를 많이 맞추는게 우선되므로
4+
5+
function solution(n, info) {
6+
let maxDiff = 0
7+
let answer = [-1]
8+
let lion = Array(11).fill(0)
9+
10+
// level은 현재 검사 중인 점수(0부터 시작), count는 남은 화살 수
11+
function dfs(level, count) {
12+
if (level == 10) {
13+
lion[level] = count // 남은 화살은 모두 0점에 사용
14+
15+
let sum = 0
16+
for (let i = 0; i < 10; i++) {
17+
if (lion[i] > info[i]) {
18+
// 라이언이 점수 획득
19+
sum = sum + (10 - i)
20+
} else if (lion[i] === info[i] && lion[i] === 0) {
21+
// 둘다 점수획득 못함
22+
continue
23+
} else if (lion[i] === info[i] || lion[i] < info[i]) {
24+
// 어피치가 점수 획득
25+
if (info[i] > 0) sum = sum - (10 - i)
26+
}
27+
}
28+
29+
if (sum > maxDiff) {
30+
maxDiff = sum
31+
answer = [...lion]
32+
} else if (sum == maxDiff && sum > 0) {
33+
// 점수차가 같으면 낮은 점수를 더 많이 맞힌 경우를 선택
34+
// 낮은 점수부터 비교
35+
for (let j = 10; j >= 0; j--) {
36+
if (answer[j] == lion[j]) {
37+
continue
38+
} else if (lion[j] > answer[j]) {
39+
answer = [...lion]
40+
break
41+
} else {
42+
break
43+
}
44+
}
45+
}
46+
return
47+
}
48+
49+
// 1. 현재 점수는 포기하는 경우 (화살 0개 사용)
50+
dfs(level + 1, count)
51+
52+
// 2. 현재 점수에서 이기는 경우 (남은화살 있고, 어피치보다 1개 더 사용)
53+
const neededArrows = info[level] + 1
54+
if (count >= neededArrows) {
55+
lion[level] = neededArrows
56+
dfs(level + 1, count - neededArrows)
57+
lion[level] = 0 // 백트래킹 초기화
58+
}
59+
}
60+
61+
dfs(0, n)
62+
63+
return maxDiff <= 0 ? [-1] : answer
64+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// https://www.acmicpc.net/problem/6603
2+
3+
const filePath =
4+
process.platform === "linux"
5+
? "/dev/stdin"
6+
: require("path").join(__dirname, "input.txt")
7+
const input = require("fs").readFileSync(filePath).toString().split("\n")
8+
const log = console.log
9+
10+
// k개의 수를 골라 집합 만들고 그 수만 가지고 번호 선택하기
11+
let answer = ""
12+
for (let i = 0; i < input.length; i++) {
13+
let [k, ...arr] = input[i].split(" ").map(Number)
14+
if (k === 0) break
15+
16+
const selected = Array(6)
17+
const result = []
18+
const dfs = (depth, start) => {
19+
if (depth === 6) {
20+
result.push(selected.join(" "))
21+
return
22+
}
23+
for (let i = start; i < arr.length; i++) {
24+
selected[depth] = arr[i]
25+
dfs(depth + 1, i + 1)
26+
}
27+
}
28+
dfs(0, 0)
29+
answer += result.join("\n") + "\n\n"
30+
}
31+
log(answer.trim())
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
7 1 2 3 4 5 6 7
2+
8 1 2 3 5 8 13 21 34
3+
0
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// https://www.acmicpc.net/problem/15649
2+
3+
const filePath =
4+
process.platform === "linux"
5+
? "/dev/stdin"
6+
: require("path").join(__dirname, "input.txt")
7+
const input = require("fs").readFileSync(filePath).toString()
8+
const log = console.log
9+
10+
// "순서"가 있게, 1-N 중 "중복없이" M개를 선택하는 문제
11+
const [N, M] = input.split(" ").map(Number)
12+
const selected = Array(M) // 총 M개를 고를 것임
13+
const visited = Array(N + 1).fill(false) // 중복선택 방지 위해
14+
const dfs = (depth) => {
15+
if (depth === M) {
16+
log(selected.join(" "))
17+
return
18+
}
19+
for (let i = 1; i <= N; i++) {
20+
if (visited[i]) continue
21+
selected[depth] = i
22+
visited[i] = true
23+
dfs(depth + 1)
24+
visited[i] = false
25+
}
26+
}
27+
28+
dfs(0, 1)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
4 2
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// https://www.acmicpc.net/problem/15650
2+
3+
const filePath =
4+
process.platform === "linux"
5+
? "/dev/stdin"
6+
: require("path").join(__dirname, "input.txt")
7+
const input = require("fs").readFileSync(filePath).toString()
8+
const log = console.log
9+
10+
// 1-N 중 "중복없이" M개를 선택하는 문제, "오름차순" 정렬 필요
11+
// => 오름차순 조건으로 인해 for문에서 start 인덱스(현재 선택한 수보다 큰 수부터)를 사용하여 구현
12+
const [N, M] = input.split(" ").map(Number)
13+
14+
const selected = Array(M)
15+
const dfs = (depth, start) => {
16+
if (depth === M) {
17+
log(selected.join(" "))
18+
return
19+
}
20+
for (let i = start; i <= N; i++) {
21+
selected[depth] = i
22+
dfs(depth + 1, i + 1)
23+
}
24+
}
25+
26+
dfs(0, 1)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
4 2
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// https://www.acmicpc.net/problem/15651
2+
3+
const filePath =
4+
process.platform === "linux"
5+
? "/dev/stdin"
6+
: require("path").join(__dirname, "input.txt")
7+
const input = require("fs").readFileSync(filePath).toString()
8+
const log = console.log
9+
10+
// 1-N 중 "중복가능하게" "순서" 있이, M개를 선택하는 문제
11+
const [N, M] = input.split(" ").map(Number)
12+
let result = []
13+
14+
const selected = Array(M)
15+
const dfs = (depth) => {
16+
if (depth === M) {
17+
result.push(selected.join(" "))
18+
return
19+
}
20+
21+
for (let i = 1; i <= N; i++) {
22+
selected[depth] = i
23+
dfs(depth + 1)
24+
}
25+
}
26+
27+
dfs(0)
28+
log(result.join("\n"))
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
4 2
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// https://www.acmicpc.net/problem/15652
2+
3+
const filePath =
4+
process.platform === "linux"
5+
? "/dev/stdin"
6+
: require("path").join(__dirname, "input.txt")
7+
const input = require("fs").readFileSync(filePath).toString()
8+
const log = console.log
9+
10+
// 1-N 중 "중복가능하게" M개를 선택하는 문제, "오름차순" 정렬 필요
11+
// => 오름차순 조건으로 인해 for문에서 start 인덱스(현재 선택한 수 이상)를 사용하여 구현
12+
13+
const [N, M] = input.split(" ").map(Number)
14+
const selected = Array(M)
15+
let result = []
16+
17+
const dfs = (depth, start) => {
18+
if (depth === M) {
19+
result.push(selected.join(" "))
20+
return
21+
}
22+
for (let i = start; i <= N; i++) {
23+
selected[depth] = i
24+
dfs(depth + 1, i)
25+
}
26+
}
27+
28+
dfs(0, 1)
29+
log(result.join("\n"))

0 commit comments

Comments
 (0)