Dev.baelanche
에라토스테네스의 체 방법으로 소수 배열을 구해놓고 합성수 k 에 대해 k보다 크면서 가장 가까운 소수 - k보다 작으면서 가장 가까운 소수를 구한다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); boolean prime[] = new boolean[1299710]; for(int i=2; i2 && i*j0) { int k = sc.nextInt(); if(prime[k]) { int s = k; int e = k; while(true) { if(!prime[--s]) break; } while(true) { if(!prime[++e]) break; } System.out.p..
BFS로 치즈의 외곽을 구하고 반복된 시뮬레이션으로 정답을 도출했다. 1. 주어진 n, m을 n+2, m+2 하여 배열을 만든다. 치즈 외곽 탐색을 위해 편의상 바깥쪽 배열을 한칸씩 여유를 두었다. 2. 배열 탐색을 줄이기 위해 치즈의 개수를 세어 변수에 담는다. 3. 치즈가 녹기 전의 배열을 저장한다. 4. 외곽 치즈를 체크한다. (0, 0)은 무조건 치즈가 없으므로 BFS를 통해 치즈가 없는 부분을 모두 체크한다. (배열 값을 -1로 만들었다.) 5. 치즈 배열 인덱스에서 상하좌우 중 한개라도 -1이면 외곽의 치즈이므로 임의의 큐에 담는다. 6. 큐에 담은 좌표를 모두 0으로 바꾼다. 7. -1로 만든 외곽치즈를 다시 0으로 바꾼다. public class Main { static int n; sta..
처음에는 DFS + 완전탐색으로 풀었는데 당연히 시간초과가 났다. 틀린소스 (타임아웃) public class Main { static int n; static int m; static int a[][]; static int dx[] = {0, 1}; static int dy[] = {1, 0}; static int max = 0; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; st = new StringTokenizer(br.readLine()); n = Integer.parseI..
입력받은 수들을 트리에 넣고 꺼내어주면 된다. 필자는 자바를 사용하는 관계로 TreeSet을 썼는데 내부적으로 정렬과 중복제거를 해준다. ublic class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); Set set = new TreeSet(); while(n-->0) { set.add(sc.nextInt()); } Iterator it = set.iterator(); while(it.hasNext()) { System.out.print(it.next() + " "); } } }
문제가 엄청긴데 요약하자면 그래프에서 A에서 B로 가는데 몇단계를 거치는지 구하라는 얘기이다. 유저가 3명일때 1 : 1->2 , 1->3 2 : 2->1 , 2->3 3 : 3->1 , 3->2 노드 별로 n-1만큼의 경우가 있고 이 경우의 합이 가장 작은 노드의 번호를 구하면 된다. 양방향 그래프를 구현한 후 DFS나 BFS로 간선을 몇번 탔는지 구한다. public class Main { static int n; static int a[][]; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokeni..
1부터 열려져 있는 창문 개수를 시뮬레이션 해보면 n이 제곱근일때 수가 증가한다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int cnt = 0; for(int i=1; i*i
문제에서 주어진대로 스왑해준다. 길이가 매우 길어질 수 있는 관계로 문자열 가지고 직접 구현할수는 없다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int k = sc.nextInt(); int a = 1; int b = 0; while(k-->0) { int tempB = a; a -= a; a += b; b += tempB; } System.out.println(a + " " + b); } }
귀찮은 문자열 문제이다. 이진수 A, B 를 입력받은 후 편의상 A가 B보다 무조건 더 길도록 했다. B의 앞부분에는 A와 길이가 맞게끔 0을 채워주고 합연산을 진행한다. 결과가 0일때만 0을 출력하고 나머지 경우에는 1로 시작해야 하므로 이부분만 따로 예외처리 해주었다. ublic class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String t1 = sc.next(); String t2 = sc.next(); if(t1.length() < t2.length()) { String temp = t1; t1 = t2; t2 = temp; } int diff = t1.length() - t2.le..