(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문이 중첩되어 있는 부분인데 ..
(Java) 코드 스쿼드 - 숫자 야구 게임
·
코딩 테스트
항상 관심 있었던 코드 스쿼드에서 마스터스 코스 안내 메일이 왔다. 처음 코딩을 시작할 때부터 코드 스쿼드의 마스터스 코스를 지원하고 싶었는데 금전적인 문제도 있고, 그 당시에 나에게는 모집 테스트의 난이도가 너무 높았기에 포기했었다. 올해 취업을 준비하면서 내가 부족하다는 사실을 뼈저리게 느껴 내년 마스터스 코스를 합류를 생각하고 있다. 물론 모집 테스트에 통과해야겠지만... 올해 입사 지원과 함께 여러 부트캠프도 지원했었지만 코딩 테스트에서 광탈했기에 마스터스 코스는 가능할까 생각이 들었다. 나 같은 사람을 위해서 숫자 야구 게임이라는 문제를 공개했길래 한번 풀어보았다. 숫자 야구 문제는 예전에 박재성 님의 TDD 강의 후기에 대해 알아보다가 본 것 같은데 그때는 풀어볼 생각도 못했었다. 문제 링크 ..
(Java) 프로그래머스 - 프렌즈4블록
·
코딩 테스트
꽤나 재밌어 보이는 문제여서 선택했지만 2단계 문제 치고 어렵다는 느낌이 들었다. 지금까지 풀어본 문제 중에 가장 구현 난이도가 높았던 것 같다. 그래서인지 이번에는 입력값을 n과 m을 30 이하, 블록은 A~Z 까지로 제한 시간을 넉넉하게 준 것 같다. 입력값이 크지 않으니 실제 코드를 작성할 때도 우당탕 3중 for문까지 돌려가면서 풀었던 것 같다. 설계는 간단하지만 생각해야 할 포인트가 꽤 있다. 1. 제거할 블록은 한 번에 제거해야 한다. 2, 제거할 블록이 겹친다면 겹쳐지는 부분은 한 번만 카운팅 되어야 한다. 3. 블록을 아래로 떨어트리는 로직을 생각하는 것이 쉽지 않다. 내가 생각한 로직은 1. 제거할 블록의 좌표를 찾는다. 나는 3중 for문을 이용해서 모든 i, j값을 돌며 오른쪽, 아래..
(Java) 프로그래머스 - 두 큐 합 같게 만들기
·
코딩 테스트
처음에는 완전 탐색으로 구현해야 하나 생각했다. 그런데 생각해보니 매 실행마다 각 큐의 합계를 비교하면 답이 나올 것 같았다. 그래서 그리디 알고리즘을 사용해서 코드를 작성했다. 처음 작성한 코드는 실제로 큐를 2개 생성해서 삽입과 삭제를 반복하며 체크하는 로직이었다. sumQ1나 sumQ2 값이 target 값과 같아질 때까지 while문을 돌린다. 그리고 q1Clone을 만들어서 q1이 처음과 같아지면 한 바퀴를 돌아도 답을 못 찾은 것이기 때문에 answer를 -1로 설정하고 탐색을 그만두게 했다. 그런데 이 코드는 테스트 케이스 11번에서 시간 초과로 계속 실패했다. 실제 queue에 삽입과 삭제를 반복하는데 시간이 꽤 걸렸던 것 같고 while문 조건을 변경하거나 break 조건을 만들면 통과될..
(Java) 프로그래머스 - k진수에서 소수 개수 구하기
·
코딩 테스트
처음 생각한 로직은 String을 k진법으로 변환후에 리스트를 선언해 맨 앞과 맨 뒤에 n을 추가한다. 다음으로 모든 조합을 만드는 메서드를 호출하고 문제에서 요구한 조건이 맞는지 확인하고 소수인지 판별하는 메서드를 호출하여 최종적으로 소수가 맞다면 answer을 증가 시키는것이었다. 그런데 문제를 너무 어렵게 생각해서 몇시간을 투자하고도 테스트 케이스 1,2 번을 맞추지 못했다. 결국 검색을 통해서 힌트를 얻었는데 생각보다 너무 간단했다. P에 각 자리수에 0이 포함되어 있으면 안된다고 했으니 0을 기준으로 숫자를 나누어 소수인지 판별하기만 하면 된다. 실패 코드(테스트케이스 1, 2 실패) import java.util.*; class Solution { static String[] arr; stat..
(Java) 프로그래머스 - 주차 요금 계산
·
코딩 테스트
저번 카카오 공채 시험에서 나왔던 문제이다. 그때는 시간이 부족해서 대강 로직만 생각하고 풀지 못했었다... 이번에는 코드 작성에 40분 정도 걸렸고 주차 요금을 계산하는 방식을 잘못 이해해서 수정에 20분, 런타임 에러가 계속 나서 디버깅하는데 20분이 걸렸다. 충분히 풀 수 있는 문제이지만 풀이 시간이 발목을 좀 잡는 것 같다. 구현을 얼마나 빠르게 하는지가 관건인데... 역시 연습밖에 답이 없는 것 같다. 필요한 알고리즘이 없어서 문제에서 요구한 대로 구현하면 된다. 내가 잘못 이해했던 포인트는 주차 요금 계산은 모든 입력이 끝나고 한번에 계산해야 한다는 것이다. 처음에는 이 조건을 잘못 이해해서 출차가 일어날때마다 요금 계산을 했는데 이렇게 하면 테스트 케이스 1번에 0000 차량은 34분 - 5..
(Java) 프로그래머스 - 양궁대회
·
코딩 테스트
카카오 문제답게 지문이 길고 조건이 많은 편이어서 문제를 이해하는데 시간이 조금 걸렸다. 로직은 완전 탐색으로 모든 중복 조합을 만들고 점수를 계산해서 라이언이 이기는 경우 info2 배열을 반환한다. 먼저 라이언이 쏜 화살을 result 배열에 넣는다. 화살은 n번 쏠 수 있으므로 result 배열을 n으로 초기화한다. 그리고 중복 조합 메서드인 com을 호출한다. 예를 들어, n이 9라면 만들어진 조합은 {0,0,0,0,3,5,9,10,10}와 같이 만들어질 것이다. 이 배열의 값이 의미하는 것은 9번의 기회에서 0번째 과녁을 4번, 3번째 과녁 한번, 5번째 과녁 한번 9번째 과녁 한번, 10번째 과녁 2번을 맞췄다는 의미이다. 이것을 info 배열의 형식으로 바꾸면 0번째 과녁은 10점이므로 {4..