Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions 김가빈/week14/260312_숫자야구.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import java.util.*;
import java.io.*;

class Main{
static int result, N;
static boolean[] visited;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
List<String[]> list = new ArrayList<>();
visited = new boolean[10];
result=0;

N = Integer.parseInt(br.readLine().trim());

for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
list.add(new String[]{
st.nextToken(),
st.nextToken(),
st.nextToken()
});
}
StringBuilder sb = new StringBuilder();
dfs(list, sb, 0);

System.out.println(result);

}

public static void dfs(List<String[]> list, StringBuilder sb, int idx){
if(sb.length() == 3) {
int cnt = 0;
for(int i=0; i<list.size(); i++){
String question = list.get(i)[0];
int strike=0, ball=0;

for(int j=0; j<sb.length(); j++){
int index = question.indexOf(sb.charAt(j));
if(index != -1){
if(index == j) strike++;
else ball++;
}
}
if(Integer.parseInt(list.get(i)[1]) == strike
&& Integer.parseInt(list.get(i)[2]) == ball) cnt ++;
}
if(cnt == N) result++;
return;
}

for(int i=1; i<=9; i++){
if(visited[i]) continue;

visited[i] = true;
sb.append(i);

dfs(list, sb, idx+1);

sb.deleteCharAt(sb.length()-1);
visited[i] = false;
}
}

}
61 changes: 61 additions & 0 deletions 김가빈/week14/260312_양궁대회.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import java.util.*;
class Solution {
int maxDiff = -1;
int[] best = {-1};
public int[] solution(int n, int[] info) {
int[] lion = new int[11];

dfs(n,0, info, lion);

return best;
}

public void dfs(int arrowLeft, int idx, int[] info, int[] lion){
//모든 점수 칸을 다 본 경우
if(idx == 11 ) {
//남은 화살들을 다 0점 칸에 몰아줘야 함.
lion[10] += arrowLeft;

int lionSum = 0, apeachSum=0;
for(int i=0; i<info.length; i++){
if(info[i] == 0 && lion[i] == 0) continue;
if(info[i] < lion[i]) lionSum += (10-i);
else apeachSum += (10-i);
}

int diff = lionSum - apeachSum;
//라이언이 이긴 경우만
if(diff > 0) {
//이겼을 때 최적화 답 구하기 위함
if(diff > maxDiff) {
maxDiff = diff;
best = lion.clone(); //배열복사
} else if (diff == maxDiff){ //같은 경우 낮은 점수 많은 순
int lionMinTotal = 0, bestMinTotal = 0;
for(int i=10; i>=0; i--){
lionMinTotal += (i*lion[10-i]);
bestMinTotal += (i*best[10-i]);
}
if(lionMinTotal < bestMinTotal) best = lion.clone();
}
}

lion[10] -= arrowLeft; //백트래킹
return;
}

//라이언은 이기려면 어피치보다 1점만 높으면 됨.
int need = info[idx]+1;
if(arrowLeft >= need) {
lion[idx] = need;
dfs(arrowLeft-need, idx+1, info, lion);
lion[idx] = 0; //백트래킹 복구
}

//점수 포기하는 경우
dfs(arrowLeft, idx+1, info, lion);

return;
}

}