(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;..
(Java) 프로그래머스 - 삼각 달팽이
·
코딩 테스트
문제의 요구사항은 간단한데 뭔가 될듯 말듯 한 느낌에 풀기가 어려웠다. 처음에는 재귀로 풀어보려고 시도했으나 실패했고 n x n 배열을 만들어서 좌표로 접근했다. 로직은 n x n 배열을 만들고 탐색 메서드를 호출해서 0,0 부터 값을 삽입한다. 탐색 메서드에서 상태를 알기 위해서 flag라는 변수를 두었고 배열의 범위를 벗어나지 않으면서 방문하지 않았다면 각 x, y의 변수를 증가시켜서 좌표를 얻었고 그게 아니라면 flag의 상태를 변경시켰다. flag가 0이면 왼쪽 아래로 좌표를 변경, flag가 1이면 오른쪽으로 좌표를 변경 flag가 2이면 왼쪽 위로 좌표를 변경하였다. 탐색이 끝나면 1부터 n까지 idx를 증가시켜가면서 필요한 값만 리스트에 저장하고 리스트를 다시 배열로 변환하여 최종적인 답을 ..
(Java) 프로그래머스 - 2개 이하로 다른 비트
·
코딩 테스트
생각보다 시간이 꽤 걸렸던 문제였다. 처음에는 n+1 수부터 2진법으로 변환해서 비트가 2개 이하로 같다면 answer 배열에 넣어주는 것으로 풀었었다. 테스트 케이스가 통과되는 것을 보면서 쉬운 문제였구나 싶었는데 어림도 없지.. 10번 11번 케이스에서 시간 초과가 났다. 어떻게 접근해야 할지 환참을 고민했는데 질문하기 탭에서 numbers 배열의 값을 짝수와 홀수로 생각하면 된다는 힌트를 얻어서 풀이에 성공했다. 로직은 numbers 배열의 값을 짝수와 홀수로 나누는 것에서부터 시작한다. 짝수라면 2진법으로 변환했을때 가장 마지막 자리가 0으로 끝나므로 가장 마지막 자리를 1로 바꿔주면 10진법에서 1이 커진 숫자이기 때문이다. 홀수라면 한번 더 생각을 해야 한다. 2진법으로 변환했을 때 숫자가 1..
(Java) 프로그래머스 - 파일명 정렬
·
코딩 테스트
문제 이름은 파일명 정렬이지만 정렬보다 문자열을 분리하는데 더 고민을 많이 했던 것 같다. 요구 조건도 간단하게 처리할 수 있는 정도여서 어려운 문제는 아니었던 것 같다. 로직은 문자열을 head - number -tail 부분으로 분리해서 File 인스턴스를 생성해 리스트에 넣고 정렬하면 된다. 문자열 분리는 처음에 split으로 시도했으나 regex를 [0-9]으로 설정하면 기준 문자가 포함되지 않아서 실패했고 StringTokenizer를 사용하면 기준 문자는 포함할 수 있지만 delim을 1~99999까지 만들 수가 없어서 실패했다. 어쩔 수 없이 number 부분이 시작되는 인덱스와 끝나는 인덱스를 찾아 subString으로 나누어서 처리했다. 이 부분의 로직이 if문이 중첩되어 있는 부분인데 ..