Dev.baelanche
일반적인 배열이나 부분합 배열로 풀면 시간초과가 난다. 나는 부분합 배열을 이분탐색하는 방식으로 풀었다. 이것말고도 풀이가 많을것 같은데 푼 사람이 얼마없어서 다른 방법은 못 찾았다. 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..
별찍기 문제집은 다 풀었는데 다른 별찍기를 찾았다 ㅋㅋ n에 따른 배열의 크기를 보면 2^n * 2^n 이다. 별은 가로, 세로 둘다 절반만큼의 크기로 왼쪽 위, 오른쪽 위, 왼쪽 아래 3군데에 똑같은 모양으로 그려져 있다. 가로, 세로 길이를 2배로 늘려가며 패턴을 3군데에 똑같이 그려주면 된다. public class Main { static char a[][]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int l = (int)Math.pow(2, n); a = new char[l][l]; for(int i=0; i
가로, 세로의 움직임을 따로 생각해보자. 가로로는 오른쪽, 왼쪽 순으로 움직이며 w*2 만큼의 시간이 경과하면 제자리로 돌아온다. 세로로도 마찬가지며 방향만 위, 아래 순이다. 시간 t 를 w*2 로 나눈 나머지만큼만 더 움직여주면 된다. public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; st = new StringTokenizer(br.readLine()); int w = Integer.parseInt(st.nextToken()); int h = I..
육지중에 가장 멀면서 빠른 길을 찾으라는 문제이다. 문맥이 참;; 배열 크기가 50*50이니 육지인 인덱스마다 BFS를 해주며 완전탐색하면 된다. public class Main { static int n; static int m; static int a[][]; static boolean visited[][]; static int dx[] = {-1, 0, 0, 1}; static int dy[] = {0, -1, 1, 0}; static int max = 0; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Stri..
알고리즘 문제에서 시계, 달력 문제는 참 단골 문제같다. 시, 분, 초가 각각 24, 60, 60 미만으로 되게 만들어주면 된다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); int d = sc.nextInt(); c += d; b += c/60; c %= 60; a += b/60; b %= 60; a %= 24; System.out.println(a + " " + b + " " + c); } }
뭔가 문제 설명이 불친절한 느낌이다. 가로, 세로 방향으로 탐색하며 1x2 크기 이상의 공간이 있다면 카운트한다. public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int a[][] = new int[n][n]; for(int i=0; i