(Java) 프로그래머스 - 방금그곡
·
코딩 테스트
어려웠던 문제였다. 로직이 간단하지도 않고 마지막까지 방심하면 틀리는 문제였기 때문이다. 꼼꼼하게 생각하지 못한 탓인지 첫 풀이에는 테스트 케이스가 반 이상 틀렸고 한번 수정에 테스트 케이스를 1~2개씩 맞추기 시작해서 결국 전부 다 맞게 되었다. 다만 문제를 푸는데 시간이 너무 오래 걸렸다. 로직 일치하는 음악이 없을 때 바로 반환하기 위해 answer를 (None)으로 초기화한다. musicinfos 배열을 순회하면서 탐색을 시작한다. 순차적으로 재생 시간을 구하는 메서드, 재생 시간에 맞춰 악보를 만드는 메서드, 조합을 검사하는 메서드를 호출한다. 첫 번째 메서드는 재생 시간을 분으로 변환해서 총 재생시간을 분으로 변환하고 시간을 반환한다. 두 번째 메서드는 재생 시간만큼 멜로디를 만들어 list에..
(Java) 프로그래머스 - 쿼드 압축 후 개수 세기
·
코딩 테스트
문제를 읽자마자 재귀를 활용해서 풀어야 한다는 사실을 알 수 있었다. 다만 로직을 한참을 고민했다. 재귀 탈출은 어떤 조건에서 해야 할지 어떤 상황에서 재귀 탐색이 들어갈지 기준을 잘 잡지 못했기 때문이다. 문제를 풀고나서 이 문제가 분할 정복에 속한다는 것을 알게 되었다. 지금까지 분할정복 문제를 한 번도 풀지 않아서 더 헤맸던 것 같다. 로직은 x, y 좌표를 기준으로 탐색 범위를 지정한다. 그리고 영역 분할 메서드를 호출한다. 그리고 현재 영역이 압축이 가능한지 압축 메서드를 호출하여 확인한다. 압축이 가능하다면 answer 배열에 바로 값을 업데이트 하고 압축이 불가능하다면 영역을 4개로 나누어서 재귀 호출을 진행한다. 1번 영역이 위 왼쪽, 2번 영역이 위 오른쪽, 3번 영역이 아래 왼쪽, 4번..
(Java) 프로그래머스 - 방문 길이
·
코딩 테스트
많이 보던 탐색 문제여서 금방 해결할 수 있을 것 같았는데 시간이 좀 걸렸다. 좌표로 접근하여 위, 아래, 왼쪽, 오른쪽을 전부 체크해야 했는데 처음에는 Map을 이용하려고 했지만 실패했다. 3차원 배열을 쓰기 싫어서 다른 방법으로 시도해봤지만 실패하고 결국 3차원 배열을 이용해서 풀었다. 로직은 좌표가 -5부터 5까지의 범위임으로 배열크기를 11로 설정한다. x, y의 좌표를 5,5에서 호출해야 0,0과 같으므로 경로 탐색 메서드의 매개변수를 5,5 로 설정한다. 그리고 dirs을 순회하며 움직이는데 범위를 벗어나는지 체크하고 방향을 체크한다. 처음으로 방문한 경로라면 answer를 증가시키고 이동한다. 최종 코드 import java.util.*; class Solution { static int a..
(Java) 프로그래머스 - n진수 게임
·
코딩 테스트
입력값으로 들어오는 변수가 4개나 되어서 문제를 잘 읽어야 했다. t값이 잘 이해가 안되었는데 정리하면 튜브가 몇번을 말해야 하는지? 가 t값이다. 입력값의 크기가 그리 크지 않아서 시간초과가 날 일은 없다고 생각해서 편하게 풀었다. 로직은 십진법의 번호를 n진수로 변환하여 배열로 만든다. 그리고 배열의 크기만큼 순환하며 순서에 맞는 번호를 StringBuilder에 추가한다. 만약 배열 순환중 StringBuilder의 크기가 t와 같아지면 탐색을 즉시 중단한다. 마지막으로 만들어진 StringBuilder를 String으로 변환후 대문자로 만들어준다. 최종 코드 class Solution { public String solution(int n, int t, int m, int p) { String a..
(Java) 프로그래머스 - 압축
·
코딩 테스트
문제를 이해하는데 은근히 시간이 걸린 문제였다. 특별한 알고리즘이 필요한것도 아닌 구현 문제였는데 조건도 까다롭다고 느껴져서 한번에 풀지 못하고 몇번 막혀서 고민하는 시간이 많았다. 처음 풀이도 정답으로 인정되었지만 깨끗하게 풀지 못한것 같아서 리펙터링을 한번 했다. 로직은 A부터 Z까지 번호를 부여해서 HashMap에 넣어준다. 그리고 i번째 글자를 빈 String에 추가하고 만들어진 글자가 사전에 있을때까지 i + 1 글자를 추가하고 탐색을 끝낸다. 만들어진 글자 - 1 만큼 인덱스를 조정하고 결과 리스트에 추가하고 다음 글자로 넘어간다. 말로 설명하니 더 복잡한것 같은데 코드로 보면 오히려 간단하다. 처음 코드 import java.util.*; class Solution { public int[]..
(Java) 프로그래머스 - n^2 배열 자르기
·
코딩 테스트
이 문제를 해결하는데 이틀이 걸렸다. 별생각 없이 문제를 읽으면 어렵지 않을 것 같은데 함정이 난무한다.... 나는 함정카드에 모두 걸려서 리팩터링 하느라 한 번에 해결하지 못하고 이틀에 걸쳐 생각해서 풀었다. 문제에 친절하게 애니메이션으로 어떻게 구현해야 할지 알려준다. 근데 이 애니메이션이 바로 첫 번째 함정카드다. n의 크기가 매우 클수도 있기 때문에 애니메이션처럼 2차원 배열을 n만큼 선언하면 바로 메모리 초과가 난다. 대부분의 테스트 케이스는 메모리 초과, 그리고 몇 개의 케이스는 시간 초과가 난다. 그러면 애니메이션 2번째 그림처럼 처음부터 1차원 배열로 만들어야겠다는 생각이 들었는데 이것도 함정카드다. 생각대로면 int[] arr = new int[n * n]으로 만들어야 하는데 이것도 메모..
(Java) 프로그래머스 - 점프와 순간 이동
·
코딩 테스트
문제를 보자마자 Dp라는걸 알았다. 난이도도 레벨2에 있기에는 너무 쉬운 문제였다고 생각한다. bottomUp 방식과 TopDown 모두 가능하지만 Topdown 방식이 더 간단해 보여서 Topdown을 이용해서 풀었다. 로직은 2로 나누어 떨어진다면 순간이동이 가능하다는 것이므로 n에서 2로 나누어준다. 그게 아니라면 한칸을 점프하고 다시 시도한다. 최종적으로 n이 0인 시작점으로 돌아온다. 최종 코드 import java.util.*; public class Solution { public int solution(int n) { int ans = 0; // dp (top-down) while (n > 0) { // 2로 나누어 떨어진다는것은 순간이동이 가능 if(n % 2 == 0) { n /= 2;..
(Java) 프로그래머스 - 영어 끝말잇기
·
코딩 테스트
쉬운 문제였다. 조건이 복잡하지도 않고 입력이 길지도 않아 문제를 읽자마자 바로 풀이를 시작해서 20분 정도 걸려서 맞췄다. 로직은 말한 단어를 저장하는 리스트와 각 사람이 말한 횟수를 카운트하는 map을 선언하고 초기화한다. 그리고 words 배열을 순회하며 올바른 단어인지 검사하고 결과를 반환한다. 최종 코드 import java.util.*; class Solution { static List list; public int[] solution(int n, String[] words) { int[] answer = new int[2]; // 단어를 저장하는 list list = new ArrayList(); // 말한 횟수를 카운트하는 map Map map = new HashMap(); // map ..
(Java) 프로그래머스 - 이진 변환 반복하기
·
코딩 테스트
너무 쉬운 문제여서 레벨2 보단 레벨 1에 있어야 하지 않을까 생각이 든다. 로직은 그냥 문제에서 요구한 그대로 코드로 구현하면 된다. 임시 String을 String += "1"로 하는것과 // s가 1이 아니면 실행 while (!s.equals("1")) { // 임시 String String temp = ""; for (int i = 0; i < s.length(); i++) { if(s.charAt(i) == '1') { temp += "1"; } else { sum++; } } // s에 temp의 길이를 이진변환 후 대입 s = Integer.toString(temp.length(), 2); // 실행횟수 증가 answer[0]++; } // 제거한 0개수 삽입 answer[1] = sum;..