목록알고리즘 (266)
Dev.baelanche
A A A C B B B C가 맨처음 들어간 문자열이고 현재 문자열이 B라면, C와 B를 비교한다. B가 C보다 순서가 같거나 빠르므로 더 앞자리와 비교한다. A와 B를 비교한다. B가 A보다 순서가 느리므로 문자열 맨뒤에 붙이게된다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); while(t-->0) { int n = sc.nextInt(); int idx = 0; String result = sc.next(); for(int i=0; i= 0) { if(result.charAt(k) >= c) { k--; } else { s = fa..
직접 구현하기에는 까다로운 문제이다. Map이나 Set은 순서를 보장하지 않으므로 중복없이 보관해봤자 인풋 순서대로 보관되지 않는다. 자료구조를 직접 만들어서 구현하는게 베스트이지만, 필자는 랭작에 미쳐있는 관계로 기존에 있는 자료구조로 하기로 했다. 자바에서는 LinkedHashMap, LinkedHashSet 이 순서를 보장해주며 중복체크를 할 수 있다. Node가 서로 Linked 되어있으니 순서는 넣은 그대로 사용해주면 되고 Set을 사용했을때는 자동 중복제거를 해주고 Map일때는 key값을 비교하여 중복제거를 해주면 되겠다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in)..
포인터를 두개 놓고 국회의원의 명예 점수가 비어있을때의 경우를 체크해주어야 한다. 예시를 보자. 1 2 3 4 5 6 7 0 1 1 1 0 1 1 국회의원은 5명이고 모독한번으로 모두 박탈시키려면 점수가 1, 2, 3, 4, 5 가 되어야 한다. 먼저, 포인터를 left, right로 두고 left의 초기값은 무조건 1이다. right의 초기값은 국회의원의 명예점수중 최소값이다. 따라서 left=1, right=2가 된다. left 포인터가 가르치는 곳에 명예점수가 비어있다면 right포인터의 명예점수가 채워져 있을때 그 값을 당겨온다. a[left] = 0, a[right] = 1 이므로 2에서 1을 빼서 1로 당겨오고 그만큼 해커를 고용한다. 1 2 3 4 5 6 7 1 0 1 1 0 1 1 left..
원래 단어와 사전의 단어를 각각 가리키는 포인터를 둔다. D E V I L I V D E V I L I V I 시작시 포인터위치는 양쪽 다 0이며 D, D를 비교한다. D E V I L I V D E V I L I V I 일치시에 양 포인터가 오른쪽으로 한칸 움직인다. D, E, V, I, L, I, V가 모두 일치하므로 포인터는 7번째 문자를 가리킨다. 원래단어의 포인터가 끝위치일때는 사전단어의 포인터만 움직이며 갑분싸 가성비가 그만큼 줄어든다. 다른 예시를 보자 D E V I L I V D E N V E R 포인터가 3번째 위치일때 글자가 서로 다르다. 이럴때는 사전단어의 포인터 위치만 증가하며 맞을때까지 움직인다. 단어가 일치하지 않으므로 갑분싸 가성비는 감소한다. 원래 단어 3번째, 사전 단어 4..
n이 10이하일때 1 n이 110이하일때 2 n이 1110이하일때 3 .... 순으로 구매해야하는 스티커가 늘어난다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); if(n >= 0 && n = i && n
완전탐색으로 풀기엔 주어진 시간이 너무 짧다. 사탕배열을 만들어 사탕이 있는지 여부를 저장해놓고 DP배열로 매 탐색마다 최대로 먹을수 있는 사탕의 개수를 갱신한다. public class Main { static boolean a[][]; static int dp[][]; public static int findCandy(int x, int y, int m) { if(x == 301 || y == 301) return 0; if(m == 0) return 0; if(dp[x][y] != -1) return dp[x][y]; if(a[x][y]) dp[x][y] = m; else dp[x][y] = 0; dp[x][y] += Math.max(findCandy(x+1, y, m-1), findCandy(x,..
매 케이스마다 주어진 문자열을 한칸씩 밀어주면서 사전의 단어를 포함하는지 확인하면 된다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String cipher = sc.next(); int n = sc.nextInt(); String s[] = new String[n]; for(int i=0; i
중간에 단 한번이라도 울림 제미니스의 점수가 높은지를 체크해야한다. 1회초, 1회말 ...... 9회초, 9회말 순으로 점수를 비교하며 한번이라도 울림쪽이 이기고 있다면 Yes를 출력해주자. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a[] = new int[9]; for(int i=0; i