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
39 changes: 39 additions & 0 deletions 4주차/가장큰수/가장큰수_이주혁.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
어떤 것 먼저?

*/
import java.util.*;
class Solution {
public static class StringNum implements Comparable<StringNum> {

String num;

public StringNum(String num){
this.num = num;
}

@Override
public int compareTo(StringNum o1){
return -1 * (this.num + o1.num).compareTo(o1.num + this.num);
}

}

public String solution(int[] numbers) {
String answer = "";

StringNum[] nums = new StringNum[numbers.length];

for(int i = 0; i < nums.length; i++) {
nums[i] = new StringNum(String.valueOf(numbers[i]));
}

Arrays.sort(nums);

if(nums[0].num.equals("0")) return "0";

for(int i=0; i<nums.length; i++) answer += nums[i].num;

return answer;
}
}
130 changes: 130 additions & 0 deletions 4주차/두동전/두동전_이주혁.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
import java.util.StringTokenizer;

/**
* 시작 시간: 오후 9시 54분
*
* 문제 해섞)
* - N*M 보드와 4개의 버튼
* - 각각의 칸은 비어있거나, 벽
* - 두 개의 빈칸에는 동전이 하나씩 놓여있다
* - 버튼은 위, 오, 왼, 아
* - 버튼을 누르면 두 동전이 동시에 이동한다
* - 이동하려는 칸이 벽이면, 이동하지 않는다
* - 칸이 없으면, 보드 바깥으로 떨어진다
* - 그 외에는 한칸 이동한다. 이동하려는 칸에 동전이 있는 경우에도 한칸 이동한다.
*
* 두 동전 중 하나만 보드엣 ㅓ떨어뜨리기 위해 버튼을 쵯 ㅗ몇번 눌러야하는지 구행햐ㅏㄴ다.
* 첫째 줄에 두 동전 중 하나만 보드에서 떨어뜨리기 위해 눌러야 하는 버튼의 최소 횟수를 출력한다.
* 만약, 두 동전을 떨어뜨릴 수 없거나, 버튼을 10번보다 많이 눌러야 한다면, -1을 출력한다.
*
*
* @author GODJUHYEOK
*
*/
public class Main {

private static class Coin {

int r;
int c;

public Coin(int r, int c) {
this.r = r;
this.c = c;
}

}

private static int N, M;
private static int[][] deltas = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
private static boolean[][][][] visited;
private static char[][] map;

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());

map = new char[N][M];
visited = new boolean[N][M][N][M];

Coin[] arr = {null, null};


for(int i=0, idx=0; i<N; i++) {
map[i] = br.readLine().toCharArray();
for(int j=0; j<M; j++) {
if(map[i][j] == 'o') {
arr[idx++] = new Coin(i, j);
}
}
}

System.out.println(gameBFS(arr));

}

private static int gameBFS(Coin[] arr) {

Queue<Coin[]> q = new ArrayDeque<Coin[]>();
visited[arr[0].r][arr[0].c][arr[1].r][arr[1].c] = true;
q.offer(arr);

int turn = 0;
while(turn < 10 && !q.isEmpty()) {

int qSize = q.size();
turn++;
for (int k=0; k<qSize; k++) {
Coin[] temp = q.poll();
for(int[] d : deltas) {

int nr1 = temp[0].r + d[0];
int nc1 = temp[0].c + d[1];

int nr2 = temp[1].r + d[0];
int nc2 = temp[1].c + d[1];

if(isOutOfRange(nr1, nc1) && isOutOfRange(nr2, nc2)) continue;
else if(isOutOfRange(nr1, nc1) || isOutOfRange(nr2, nc2)) {
return turn;
}

if(visited[nr1][nc1][nr2][nc2]) continue;

visited[nr1][nc1][nr2][nc2] = true;

if(map[nr1][nc1] == '#') {
nr1 = temp[0].r;
nc1 = temp[0].c;
}

if(map[nr2][nc2] == '#') {
nr2 = temp[1].r;
nc2 = temp[1].c;
}

q.offer(new Coin[] {new Coin(nr1, nc1), new Coin(nr2, nc2)});

}
}
}

return -1;

}

private static boolean isOutOfRange(int r, int c) {
return r < 0 || c < 0 || r>=N || c>=M;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
static final int MAX = 1001;
static final int INF = Integer.MAX_VALUE;
static ArrayList<Pair>[] adj = new ArrayList[MAX];
static int[] dist = new int[MAX];
static int[] dp = new int[MAX];

static class Pair implements Comparable<Pair> {
int cost, vertex;
public Pair(int cost, int vertex) {
this.cost = cost;
this.vertex = vertex;
}
public int compareTo(Pair other) {
return Integer.compare(this.cost, other.cost);
}
}

public static void dijkstra(int start) {
Arrays.fill(dist, INF);
PriorityQueue<Pair> pq = new PriorityQueue<>();
dist[start] = 0;
pq.add(new Pair(0, start));
while (!pq.isEmpty()) {
Pair top = pq.poll();
int curCost = top.cost;
int cur = top.vertex;
if (dist[cur] != curCost) continue;
for (Pair edge : adj[cur]) {
int nextCost = edge.cost;
int next = edge.vertex;
if (dist[next] > curCost + nextCost) {
dist[next] = curCost + nextCost;
pq.add(new Pair(dist[next], next));
}
if (dist[cur] > dist[next]) {
dp[cur] += dp[next];
}
}
}
}

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
for (int i = 0; i < MAX; i++) {
adj[i] = new ArrayList<>();
}
dp[2] = 1;
while (m-- > 0) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
adj[a].add(new Pair(c, b));
adj[b].add(new Pair(c, a));
}
dijkstra(2);
System.out.println(dp[1]);
}
}