목록[코딩테스트]/문제풀이 (54)
요르딩딩
이번문제는 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..
이번문제는 dfs/bfs로 풀 수 있는 문제입니다. 처음에는 이차원 배열을 활용한 dfs로 구현하였으나, 단방향/양방향에 이슈로 인해 정답이 제대로 나오지 않았습니다. 처음에 구현한 방식은 이차원 배열의 값들을 하나씩 체크하여, 지나갈 수 있고 방문가능한 갯수를 세었습니다. [1, 0, 0, 1] [0, 1, 1, 0] [0, 1, 1, 0] [1, 1, 0, 1]] 이렇게 하다보니 위와 같은 케이스에서 단방향/양방향 이슈에 직면하였습니다. (2->4 = 0) 물론 이것을 양방향으로 만들어도 원하는 결과를 도출해 낼 수 없었습니다. 그 이유는 원하는 정답을 도출해 내는 방식이 틀렸기 때문이라고 생각합니다. 그리하여, 리스트를 활용한 dfs를 활용했습니다. 네트워크와 같이 하나의 흐름을 쭉 확인해야하는 문..
이번문제는 우선순위 큐로 풀었어야 했을거 같은데, 시간관계상 리스트를 매번 정렬하는 방식으로 풀어보았다. 리스트를 매번 정렬하는게 비효율 적이라 생각되어, 나중에 우선 순위 큐로 다시 한번 풀어봐야겠다. import java.util.*; class Solution { public int[] solution(String[] operations) { int[] answer = new int[2]; ArrayList list = new ArrayList(); for (String a : operations) { String[] tmp = a.split(" "); String cmd = tmp[0]; int value = Integer.parseInt(String.valueOf(tmp[1])); if (cmd..
이번문제는 기본적인 흐름대로 구현하여도 무난하게 풀 수 있는문제이다. 다만, 2차원 배열의 내부가 길이가 다 다르다는 점만 주의하면된다. import java.util.*; class Solution { public int solution(int[][] triangle) { int answer = 0; int n = triangle.length; List arr = new ArrayList(); // 루트노드부터 계산한 합만 들어가 리스트 for(int i=0; i < n; i++) { // 초기화 arr.add(new int[i+1]); } int[]a = arr.get(0); // 최초갑 세팅 a[0] = triangle[0][0]; for (int i = 1; i < triangle.length; ..
해당 값을 갯수로 나눈 후 뒤에서 부터 하나씩 +1을 헤준다. import java.util.*; class Solution { public int[] solution(int n, int s) { int[] answer = new int[n]; int value = s/n; // 몫 int mod = s%n; // 나머지 구하기 if (value == 0) { // 없는경우 answer = new int[1]; answer[0] = -1; return answer; } for(int i=0; i < n; i ++) { answer[i] = value; } int index = n-1; for(int i=0; i
이번문제도 풀어서 구현하는거는 어렵지 않았다. 다만, 예외사항들이 존재해 중간중간 디버깅하면서 처리해 주는것도 어렵지 않았다. 여기서 나는 크게 두가지 구현을 생각했다. 1. 진수변환 2. 소수찾기 진수변환은 계속 나누어 나머지를 역순으로 적용하는 방법을 사용. 소수찾기는 소수란 1과 자기자신으로만 나눠지기에 둘을 제외한 나머지 값으로 나누었을때 안나눠지면 소수로 판단 이렇게 구현을 하고 나니 2가지 케이스에서 이슈가 발생했다. 1번째는 런타임 이슈, 2번째는 느낌상 0 값을 넣었을때였다. 2번째는 역시 0을 넣었을때 1이 나와, 0이 나오도록 예외처리를 해주었다. 여기서 핵심은 1번 이슈인거 같은데, 소수를 구할때 1~자기자신까지 모두 나눌 필요 없이 제곱근까지만 나눠보면 판단 할 수 있다는 점이다. ..
이번문제는 예외사항을 제외하면 구현하기에는 어렵지않은 문제이다. 여기서 주의해야 할 점에 대해서 알아보자. 1. 영문자만 가능 : 정규식 사용 2. 대소문자 구분 없음 : 모두 대문자로 치환하여 사용 3. 두 집합이 모두 공백일 경우 : 65536 바로 반환 4. list에서 contains() 사용하여 비교가능 5. list 깊은 복사는 .addAll() 사용 6. 교집합 개수 구할때 비교하는 집합에서 제거해가며 카운트해야 올바른 개수를 구할 수 있다. 7. 나누기 소수점 이슈 double사용 8. 소수점 버리기 이슈 int형으로 반환 import java.util.*; class Solution { public int solution(String str1, String str2) { int answe..