목록Data Structure & Algorithm/PS - JAVA (270)
Dev.baelanche
입력받은 수들을 트리에 넣고 꺼내어주면 된다. 필자는 자바를 사용하는 관계로 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..
일반적인 배열이나 부분합 배열로 풀면 시간초과가 난다. 나는 부분합 배열을 이분탐색하는 방식으로 풀었다. 이것말고도 풀이가 많을것 같은데 푼 사람이 얼마없어서 다른 방법은 못 찾았다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int a[] = new int[n+1]; for(int i=0; i0) { int t = sc.nextInt(); int left = 1; int right = n; while(left t) right = mid-1; else left = mid+1; } System.o..
그리디 알고리즘 입문급 문제이다. 최솟값을 구해야 하므로 버튼 값이 큰것부터 우선으로 누른다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = 0; int b = 0; int c = 0; int t = sc.nextInt(); while(t >= 10) { if(t >= 300) { t -= 300; a++; } else if(t >= 60) { t -= 60; b++; } else if(t >= 10) { t -= 10; c++; } } System.out.println(t == 0 ? a + " " + b + " " + c : -1); } }
문제에서 요구하는대로 로봇을 움직여주면 된다. 필자는 DFS로 풀었다. 흠.. 그냥 DFS문제라서 추가적으로 언급할 얘기는 없다;; public class Main { static int r; static int c; static int a[][]; static int d[] = new int[4]; static int lx; static int ly; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; st = new StringTokenizer(br.readLine()); r = In..