Skip to content
Open
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
109 changes: 109 additions & 0 deletions 11월23일/초중급/1923012_10971.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

static int n; //도시의 수
static boolean[] visited; //방문 여부 기록용 배열
static ArrayList<ArrayList<Integer>> info = new ArrayList<ArrayList<Integer>>();
static int answer; //정답을 저장할 변수

public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

/*
* 입력값 받아오기
*/
n = Integer.parseInt(br.readLine());

visited = new boolean[n];
for(int i=0; i<n; i++) info.add(new ArrayList<Integer>());

for(int i=0; i<n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0; j<n; j++)
info.get(i).add(Integer.parseInt(st.nextToken()));
}


/*
* 문제 해결
*/

answer = Integer.MAX_VALUE;

for(int i=0; i<n; i++) {
Arrays.fill(visited, false);
visited[i] = true;
for(int j=0; j<n; j++) {
int cost = info.get(i).get(j);
if(cost == 0) continue; //갈 수 없는 도시이면 무시
solve(i, j, cost);
}
}


/*
* 정답 출력
*/
System.out.print(answer);


}

//재귀적으로 정의된 문제해결 함수
//매개변수는 출발한 첫 도시(start), 현재 있는 도시(cur), 현재까지 든 비용(sum)
public static void solve(int start, int cur, int sum) {
//이미 방문한 도시인 경우 리턴
if (visited[cur]) return;


//처음 온 도시인 경우
//이 도시에 새로 방문했음을 표시
visited[cur] = true;


//이번 도시에 옴으로써 모든 도시를 다 방문한 경우
//첫 도시로 돌아가는 비용을 더하여 최종 계산을 한 후 리턴
if(allTrue()) {
//만약 현재 도시에서 출발지점으로 돌아가는 길이 없는 경우 그냥 리턴
if(info.get(cur).get(start) == 0) {
visited[cur] = false;
return;
}
//그렇지 않은 경우엔 최종 계산 수행
sum += info.get(cur).get(start);
answer = Math.min(answer, sum);
visited[cur] = false;
return;
}


//아직 갈 도시가 더 남은 경우
//이 도시에서부터 길이 뻗어있는 모든 도시에 대하여 재귀
for(int i=0; i<n; i++) {
int cost = info.get(cur).get(i);
if (cost == 0) continue; //갈 수 없는 도시이면 무시
solve(start, i, sum + cost);
}

visited[cur] = false;
return;

}

//모든 도시를 다 방문했는지 체크하는 함수
//아직 안 간 도시가 하나라도 있으면 false를 리턴, 모든 도시를 갔으면 true를 리턴
public static boolean allTrue() {
for(boolean b: visited) {
if(!b) return false;
}
return true;
}

}
86 changes: 86 additions & 0 deletions 11월23일/초중급/1923012_2580.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import java.util.Scanner;

public class Main {

static int[][] arr = new int[9][9]; //스도쿠 판
static StringBuilder sb;

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);

//스도쿠 판의 내용 읽어오기
for(int i = 0; i<9; i++) {
for(int j = 0; j<9; j++) {
arr[i][j] = sc.nextInt();
}
}

//문제 풀어서 출력하기
sb = new StringBuilder();
sudoku(0,0);

sc.close();

}

static void sudoku(int row, int col) {
//해당 행을 다 살폈다면 다음 행의 첫 칸으로 넘어가서 재귀
if(col == 9) {
sudoku(row+1, 0);
return;
}

//마지막 행(row == 8인 행)까지 다 채워졌다면 출력
if(row == 9) {
for(int i = 0; i<9; i++) {
for(int j = 0; j<9; j++) {
sb.append(arr[i][j] + System.getProperty("line.separator"));
}
sb.append(System.getProperty("line.separator"));
}
System.out.print(sb);
System.exit(0);
}

//이번 칸이 빈칸이라면 가능한 수를 찾아 적어넣어준 후, 같은 줄 다음 칸으로 재귀
if(arr[row][col] == 0) {
for(int i = 1; i<=9; i++) {
if(possible(row,col,i)) {
arr[row][col] = i;
sudoku(row,col+1);
}
}
arr[row][col] = 0;
return;
}

//이번 칸이 빈칸이 아니라면 그냥 같은 줄 다음 칸으로 재귀
sudoku(row, col+1);
}

//(row,col)에 num이 들어갈 수 있는지를 체크하는 함수(들어갈 수 있으면 true, 아니면 false를 리턴)
static boolean possible(int row, int col, int num) {
//1. 같은 행에 겹치는 수가 있는지 체크
for(int i = 0; i<9; i++) {
if(arr[row][i] == num) return false; //겹치는 수가 있으면 즉시 false를 리턴
}
//2. 같은 열에 겹치는 수가 있는지 체크
for(int i = 0; i<9; i++) {
if(arr[i][col] == num) return false; //겹치는 수가 있으면 즉시 false를 리턴
}
//3. 같은 3x3 구역에 겹치는 수가 있는지 체크
//해당 칸이 속한 3x3구역의 첫 칸의 좌표 구하기
int startrow = (row/3)*3;
int startcol = (col/3)*3;
for(int i = startrow; i<startrow+3; i++) {
for(int j = startcol; j<startcol+3; j++) {
if(arr[i][j] == num) return false; //겹치는 수가 있으면 즉시 false를 리턴
}
}

//위의 세 단계에서 한 번도 false를 리턴하지 않았다면 true를 리턴
return true;
}

}