"꾸준하고 완벽한 한 걸음"

PS/Baekjoon Online Judge 674

[백준 27376] 참살이길 [Java]

문제https://www.acmicpc.net/problem/27376 풀이구현 시뮬레이션에 시간도 계산해야 하는 문제라 난이도에 비해 까다로웠다.0에서 N까지 1씩 이동해야 하며, k개의 신호등이 초록불일 때만 이동하는 문제다.신호등의 위치가 순서대로 주어지는 보장이 없으니 입력받은 신호등 정보를 좌표 기준으로 오름차순 정렬하자. List list = new ArrayList(); for (int i = 0; i a[0]));정렬된 신호등까지는 1씩 이동한다. 마지막 위치에서 신호등 위치까지의 거리를 이용해 한 번에 계산하자. long time = 0, lastPos = 0; for (int[] info : list) { final..

[백준 10844] 쉬운 계단 수 [Java]

문제https://www.acmicpc.net/problem/10844 풀이정수 N이 주어졌을 때, 길이가 N인 수 중 문제에 주어진 ‘계단 수’가 몇 개 인지 알아내는 문제다.우선 N이 1일 때 존재하는 계단 수는 1 ~ 9이다. int[][] dp = new int[N + 1][11]; for (int j = 1; j N이 2일 때는 이전 계단 수에서 1을 더하거나 뺀 값들이 새로운 계단 수가 된다.따라서 점화식을 다음과 같이 정의할 수 있다.dp[i][j] : 길이가 i이면서, 마지막 숫자가 j로 끝나는 계단 수dp[i][0]은 dp[i - 1][1]에서 1을 뺀 결과이고, dp[i][9]는 dp[i - 1][8]에서 1을 더한 값이다. for (int i = ..

[백준 15658] 연산자 끼워넣기 (2) [Java]

문제https://www.acmicpc.net/problem/15658 풀이배열 A에 대해 주어진 연산자를 활용해 만들어지는 모든 식의 결과 중 최대/최소값을 구하는 문제다.중간값과, 다음에 계산할 요소의 인덱스를 넘겨주는 방식으로 풀이했다.만약 인덱스가 A의 길이와 같다면 더 이상 연산할 요소가 없기 때문에 연산을 중단하고 결과를 갱신했다. private static void bt(int temp, int nextIdx) { if (nextIdx == A.length) { max = Math.max(max, temp); min = Math.min(min, temp); return; }아직 연산할 요소가 남아있는 경..

[백준 23827] 수열 (Easy) [Java]

문제https://www.acmicpc.net/problem/23827 풀이주어진 수열에 대해 1 ≤ i 수가 너무 커질 수 있으니 1e9 + 7로 나눈 나머지를 출력해야 한다.문제를 만족하는 정수쌍 곱의 합은 i와 i + 1 ~ j의 합의 곱과 같다.최대 길이가 50만인 수열에 대해 누적합을 미리 구해 // Solve final int MOD = (int) (1e9 + 7); long[] prefixSum = new long[N]; prefixSum[0] = A[0]; for (int i = 1; i 모든 i에 대한 A[i] * ( prefixSum[N] - prefixSum[i] )을 구하면 된다. long res = 0; ..

[백준 30979] 유치원생 파댕이 돌보기 [Java]

문제https://www.acmicpc.net/problem/30979 풀이F의 합이 T이상인지 확인하는 문제다.T이상일 때 파댕이가 울지않기 때문이다. final int fSum = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).sum(); // Solve & Output System.out.println(T 풀이 시간≤ 2m소스코드https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/practice/30979.java problem-solving/baekjoon-online-judge/practice/309..

[백준 32335] 부자가 될 거야! [Java]

문제https://www.acmicpc.net/problem/32335 풀이주어진 문자열 S의 각 자릿수를 회전시켜 가장 작은 수를 만드는 문제다.총 M번 회전 시켜야 하며 수는 증가하는 방향으로 회전해야 한다.맨 앞자리부터 시작해서 0으로 만들 수 있을 만큼 M이 크다면 돌려주고, 아니면 다음 수로 넘어가면 된다. // Solve for (int i = 0; i '0') { final int num = S[i] - '0'; if (num + M >= 10) { S[i] = '0'; M -= (10 - num); } ..

[백준 01639] 행운의 티켓 [Java]

문제https://www.acmicpc.net/problem/1639풀이주어진 문자열 S에 대해 2N자리의 부분 문자열의 각 자리를 더했을 때 왼쪽과 오른쪽 N자리의 합이 동일한 부분 문자열의 최대 길이를 구하는 문제다.우선 S의 길이에 따라 가능한 최대 크기를 정해주자.홀수면 1을 빼고, 짝수면 원래 크기 그대로 최대 크기가 될 수 있다. // Solve int GAP = nums.length % 2 == 0 ? nums.length : nums.length - 1;길이가 홀수인 정답은 없으므로 GAP이 0이 될 때 까지 2씩 감소시키며 문제의 조건을 만족시키는 부분 문자열을 찾으면 된다. while (GAP > 0) { for (int i = ..

[백준 25594] HG 음성기호 [Java]

문제https://www.acmicpc.net/problem/25594 풀이문자열 S가 사전에 주어진 매핑표의 문자열들로 구성되어있는지 확인하는 문제다.직관적인 매핑을 위해 Map으로 매핑 테이블을 만들었다.단순히 문자열 배열로 만든 후 아스키코드값을 인덱스처럼 활용하는 방법도 있다. // Solve Map map = new HashMap(); map.put('a', "aespa"); map.put('b', "baekjoon"); map.put('c', "cau"); map.put('d', "debug"); map.put('e', "edge"); map.put('f', "firefox"); m..

[백준 01408] 24 [Java]

문제https://www.acmicpc.net/problem/1408 풀이두 시간대가 주어졌을 때 시간의 차를 계산하는 문제다.시작 시간과 종료 시간은 최대 48시간 차이가 날 수 있다. 이는 LocalTime.parse로 충분하다. // Input LocalTime start = LocalTime.parse(br.readLine()); LocalTime end = LocalTime.parse(br.readLine());시작 시간과 종료 시간의 차가 음수라면, 종료 시간은 시작 시간의 다음 날을 의미한다.24시간을 더한 후 올바른 차를 계산해서 출력하자. // Solve int totalSec = (int) Duration.between(st..

[백준 14335] 서로 다른 부분 수열의 개수 [Java]

문제https://www.acmicpc.net/problem/14335 풀이문자열 S에 대해 순서를 고려한 서로 다른 부분 수열의 수를 구하는 문제다.문자열의 길이가 최대 1,000으로 모든 부분 수열들을 구하고 중복을 제거한다면 시간 초과가 발생한다.순서를 고려하므로 중복되는 문자에 대한 부분 수열을 제거해야 한다.dp[i] : i번까지 문자들로 만들어진 서로 다른 부분 수열의 수중복을 고려하지 않고 부분 수열의 수를 기록하자. long[] dp = new long[N + 1]; dp[0] = 1; for (int i = 1; i 이제 중복되는 요소를 제거해보자.이전에 마지막으로 등장한 S[i - 1]의 위치를 j라고 하자..