목록[코딩테스트]/문제풀이 (54)
요르딩딩
이번문제는 검색해서 찾아보기 전까지는 해결방법을 적용하기가 어려웠다고 생각한다. 찾아보니 comparator와 정규식을 사용하면 보다 편하게 풀 수 잇었다는것을 배울 수 있었다. 이번기회에 comparator와 정규식을 익혀야겠다 import java.util.*; class Solution { public String[] solution(String[] files) { String[] answer = {}; compartor c = new compartor(); Arrays.sort(files, c); return files; } } class compartor implements Comparator{ @Override public int compare(String o1, String o2) { Str..
https://programmers.co.kr/learn/courses/30/lessons/92341 코딩테스트 연습 - 주차 요금 계산 [180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000] programmers.co.kr 이번문제를 풀면서 다시한번 알아두면 좋은 기능들을 확인해볼 수 있었다. 1. map에 key기준 오름차순으로 정렬해주는 TreeMap 2. map에 누적값을 넣을때 사용하면 좋은 map..
https://programmers.co.kr/learn/courses/30/lessons/62048 코딩테스트 연습 - 멀쩡한 사각형 가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 programmers.co.kr 이번문제는 구현하기는 쉬우나 구현을 위한 규칙을 찾기가 너무 어려운 문제인거 같다. 이게 정령 레벨2의 문제란 말인가... 최대한 규칙을 찾으려고 2차원 배열로 각각의 경우를 다 적어봤으나 찾을 수 없어, 검색을 통하여 풀이를 확인 한 뒤 구현을 하였다. 규칙 : 가로 * 세로 - (가로 + 세로 - 최대공약수) 이번문제를 통해 최대공..
이번문제는 예전에 못풀었던 문제라 다시 풀어보게되었다. 첫 시작할때 역시 규칙을 찾으려고 하였으나, 쉽지 않았다. 문득 든 생각이 모눈종이였다. 이차원배열에서 색종이가 놓이는 부분을 1로, 안놓이는 부분을 0으로 간주한다면, 겹치는 부분의 규칙을 생각할 필요없이 겹치면 그냥 1로 두면 되기 때문이다. 이 모눈종이의 힌트는 페이지 마지막에 초등부 문제라고 적혀있어서, 접근을 할 수 있었던거 같다. 난이도도 쉽고 초등부인데 왜 이렇게 어렵나 했다. import java.util.*; class Main { static int n, cnt = 0; static int[][] graph; public static void main(String[] args) { Scanner sc = new Scanner(Sys..
https://www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net 이번문제는 DP 문제 중에서 난이도가 낮은 문제라고 생각된다. 규칙을 찾기도 쉽고, 구현하는것도 할만하기 때문이다. 다만, 처음에는 최대값을 생각하지 않고, 해당 날짜에서 순차적으로 선택했을때의 결과를 DP에 넣고, 그중 가장 큰 값을 반환하게 하였으나, 마지막 예제에서 잘못된 결과가 반환되는것을 보고, 잘못 생각한것을 알 수 있었다. 이문제에서의 포인트를 살펴보자. 여기서의 포인트는 역순으로 DP를 입력하는것이다. 그 이유는 현재 위치에서 선택할수 있는 최대금액을 뽑는것이고, 그것이 마지막에서 앞으로 갈 수록 도출한 결과를 중복해서..
이번문제 역시 DP 문제중 하나이다. 매번 풀때마다 느끼는 거지만 DP문제는 어려운것 같다. 많이 풀어보도록 해야겠다. 구현하는것은 어렵지 않으나, 점화식 및 규칙을 찾는 부분이 어렵게 느껴진다. 이번문제는 비슷하게 접근은 했으나, 규칙을 찾지 못해 풀이를 찾은 후 이해한 뒤 풀어보았다. 풀이는 아래 사진을 참고하면된다. 다음에 이와같이 DP문제가 나왔을때 이번 경험을 토대로 잘 풀 수 있었으면 좋겠다. 화이팅!!! import java.util.*; class Main{ static int n, m; static int[] coin, dp; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextIn..
역시 아직까지 DP문제는 조금 어렵게? 느껴지는것 같다. 처음에는 재귀를 사용하여 풀었느나, 시간초과가 나와 다른 방법을 찾아보던 중 DP를 사용하게 되었다. DP를 사용할때 헷갈렸던 부분은 해당 위치에 값을 넣을때 기준이 dp[i][j + value] += dp[i][j];// 오른쪽 dp[i + value][j] += dp[i][j]; // 아래 되는 부분이 이해가 안갔다. 내가 생각한 DP테이블은 해당 점을 지나가는 횟수가 해당점에 기록된다고 생각했다. 하지만, 기준은 해당점에 도달할 수 있는 경로의 수를 표시하는 거였다. 아래 내용을 바탕으로 나는 dp[1][1]을 4번 지나가니깐 4가 들어가야되는거 아닌가 생각했다. 하지만, 지나가는 횟수가 아니라, dp[0][0] -> dp[1][1]까지 갈수..
이번문제는 쉬운듯 하면서도 어렵게 느껴졌던 문제이다. 그이유는 아무래도 익숙하지 않아서 그런것 같다. 처음에 2차원 배열말고, 1차원 배열로 적용하자니 왼쪽 위, 오른쪽 위의 인덱스를 찾아서 더해주는 부분을 구현하는데 애를 먹었다. 검색을 해보니 2차원 배열을 이용하는 내용이 있어, 참고 할 수 있었다. import java.util.*; class Main { static int n, result = 0; static int[][] dp; public static void dp() { for (int i = 1; i < n; i++) { // dp[0][0] 제외 for (int j = 0; j