목록분류 전체보기 (240)
요르딩딩
이번문제는 생각하기 그리 어렵지 않은 문제이다. 다만, 구현하기가 은근히 까다로운 문제이다. 여기서 나의 풀이법에 대해 설명해 보겠다. int count = 전체 길이에서 제거해야할 숫자를 뺴면, 구해야하는 숫자의 갯수를 알 수 있다. 가장 큰 값을 구해야하므로, 맨 앞자리 부터 하나씩 나올 수 있는 수 중, 가장 큰 값을 골라주면 된다. (테스트케이스 3번) "4177252841" 여기서 10-4= 6개의 수를 골라야한다. 숫자는 맨 앞자리가 가장 클 수록 큰 수이다. 그러므로 맨 앞자리로 올 수 있는 수는 "41772" 중 하나이다. 왜냐하면, 한자리를 고르고나면, 나머지 5자리도 골라 줘야하기때문에, 뒤에 5자리는 남겨두어야 한다. (맨 앞자리가 가장 크다면, 뒤에는 어떤 수가 와도 상관없기 떄문이..
이번문제는 상당히 생각하기 까다로운 문제라고 생각한다. 이 문제 역시 다름 사람들의 해답을 참고하였다. 물론 내가 그리디 문제에 약한거 같기도 하지만, 이 문제 역시 Level2치고 어렵다는 평이 많은거 같다. 이 문제에서 포인트는 이동거리이다. 알파벳 상/하 이동의 경우는 아스키코드를 활용하면 차이를 이용해 쉽게 구할 수 있다. 이제 포인트인 이동거리에 대해 확인해보자. 이동거리가 최대인 경우는 그냥 쭉 오른쪽으로 이동하는 것이다 즉, name.length() -1 이 최대가 될 것이다. 하지만, 우리는 최소 이동거리를 구해야 하므로, AAA와 같이 변경이 필요없는 A가 나올경우, 그대로 그냥 쭉 오른쪽으로 진행할 것인지, 아니면 처음 되돌아가서 뒤로 진행할 것인지 정해야한다. 그러므로, A가 나오게 ..
이번문제는 구현하기는 쉬우나, 방법을 생각해내는것이 어렵다고 생각합니다. 여러가지 방식을 정해보았으나, 결국 명확한 해법을 찾지못해 다른 사람들의 방식을 확인 후 구현하였습니다. 풀이법은 단순합니다. 1. 사람들을 오름차순으로 정렬한 후 2. 최대 2명만 태울 수 있으니, 가장 작은사람 + 가장 큰사람 answer++ ---> ((front:50), 50, (back:70), 80) =====> answer++ ---> ((front:50), (back:50), 70, 80) =====> answer++ ((front: 50), 70, (back:80)) =====> answer++ ---> ((front:50), (back:70), 80) =====> answer++ ---> ((front:50), (..
이번문제는 범위에 대한 구분만 잘 한다면, 풀 수 있는 문제이다. 보다 쉬운 방법이 있지만, 나는 아래와 같은 방식으로 구현하였다. 여기서 중요한 점은 도착점이 가장 작은거 부터 확인을 해야한다는 것이다. import java.util.*; class Solution { public int solution(int[][] routes) { int answer = 0; Arrays.sort(routes, (a,b)-> Integer.compare(a[1], b[1])); boolean[] visited = new boolean[routes.length]; // 갯수만큼 생성 for (int i = 0; i < routes.length; i++) { // 범위 전체 반복 if (visited[i]) { // ..
이번문제는 생각보다 한번에 해결책이 떠오르지 않아 조금 오래걸렸던 문제입니다. 딱히 효율적인 방안이 떠오르지 않고, 경우의 수가 6개 밖에 되지 않아 전부 다 계산하는 방법을 선택했습니다. [설명] 해당 수식을 숫자와 연산자를 각각 리스트에 담는다. 6가지 경우 수에 따라 연산자 우선순위대로 계산을 진행한다. 이때, 연산은 List에서 직접 수행한다. 연산자가 나오면 앞뒤로 계산을 수행 후, 연산에 관여된 3개의 데이터를 삭제 한다. 이때, 리스트삭제로 인해 index가 변경되니, 주의하자. -> (i-1)위치 3번삭제 후 -> i--적용 한번의 경우의 수가 끝나면, 절댓값 적용 후 다른 경우의 값보다 크면 업데이트한다. 주의, 결과값을 long형으로 타입을 변경해 주어야한다. import java.ut..
이번문제는 생각보다 애를 먹은 문제입니다. 처음에는 DPS로 최단경로를 구하였으나, 효율성 문제 실패로 인해 DP로 다시 풀어보았습니다. 물론 DP로 풀때는 다른 분들의 로직을 참고하였습니다. 이번문제는 m,n의 값이 반대인 경우라 조금 헷갈리는 부분이 있었습니다. 하지만 한번 이해하면 그다지 어려운 문제는 아니라 생각합니다. 2차원 배열에서의 해당 위치까지오는 최단 경로 구하는 문제의 핵심은 해당 위치까지 오는 최단 경로의 수 = 그 전(상/좌) 경로의 수의 합 이라는 것을 생각하면 됩니다. 또한 효율성을 위해 1,000,000,007을 매번 계산하여 구하는 것 보다 해당 값을 넘는 경우만 나머지를 구하여 적용하면 보다 더 효율적인 코드가 됩니다. import java.util.*; class Solu..
이번문제는 Array.sort를 사용하면 충분히 빠르게 풀 수 있는 문제입니다. 곱의 값을 가장 작게 만들기 위해서는 가장 작은값 X 가장 큰값을 해주어야합니다. 그러기위해서, A배열을 오름차순으로 B배열을 내림차순으로 정렬하여, 서로 곱해주면 됩니다. Arrays.sort의 내림차순정렬을 위해 Collections.reverseOrder()를 사용하려면 int형이 아닌 integer형으로 형변환을 해주어야합니다. Arrays.sort(T[] a, Comparator c) method를 제공해 주는데 왜 안되면, Arrays.sort(T[] a, Comparator c)에서 사용되는 T는 Generic Class로 어떠한 객체도 허용하게 해주었지만, int는 객체가 아닌 primitive type이었던 ..
이번문제는 처음에 생각보다 접근 방식은 좋았다고 생각한다. 다만 오랜만에 BFS 관련 문제를 풀다보니, 헷갈리는 부분에 있어서 오래걸렸다. 이 문제를 BFS라고 판단한 이유는 최단경로를 구하는것이기 때문이다. 우선, 각각의 글자를 노드라고 생각하고, 접근 가능한(한글자 차이나는 값)노드를 연결시켜, 연결리스트 형태를 만들었다. List list = new ArrayList(); list.get(0) = [1,3] list.get(1) = [0,2,3] list.get(2) = [1,4,5] list.get(3) = [0,1,4] list.get(4) = [2,3,5] list.get(5) = [2,4] 추가로, 각각의 노드의 방문상태를 나타내는 visited[], 각각의 노드의 거리를 나타내는 resul..