(Java) 프로그래머스 - 우박수열 정적분
·
코딩 테스트
문제가 콜라츠 추측과 정적분이 같이 있어서 조금 읽기 어려웠다. 문제가 이해가 된다면 그리 어렵지 않은 문제였다. 인풋값이 작아서 시간 초과 걱정은 하지 않았고 완전 탐색으로 모든 넓이의 조합을 다 만들어 둘까 생각하다 너무 비효율적인 것 같아 배열을 돌면서 바로바로 넓이를 구했다. 로직 k가 1이 될때까지 나머지 숫자를 구하고 list에 추가한다. 그리고 정적분을 진행하면 되는데, 먼저 정적분의 범위를 구하고 시작 값이 끝 값보다 크다면 answer 배열에 -1을 추가하고 넘어간다. 시작 값이 끝 값보다 작다면 x의 크기를 1로 고정하고 사다리꼴의 넓이를 구하고 이를 sum에 추가한다. 사다리꼴의 넓이는 (윗변 + 아랫변) x 높이 / 2인데, 여기서 높이는 1로 고정되어 있으므로 (윗변 + 아랫변) ..
(Java) 프로그래머스 - 연속된 부분 수열의 합
·
코딩 테스트
문제를 읽고 완전 탐색은 인풋값이 크기 때문에 당연히 시간 초과가 난다고 생각해서 배제했다. 부분 수열 문제에서 O(N) 로직을 가지는 건 투포인터와 슬라이딩 윈도우인데, 이번 문제는 정렬되어 있고, 부분 수열의 길이가 가변적이니 투포인터를 사용했고 문제 조건에 맞게 저번 카카오 문제에서 썼던 Comparator를 사용하여 정렬하고 값을 리턴했다. 오랜만에 투포인터를 써서 더듬거리며 풀었지만 꽤 재미있었다. 최종 코드 import java.util.*; class Solution { public int[] solution(int[] sequence, int k) { int[] answer = new int[2]; List list = new ArrayList(); int start = 0; int end..
(Java) 프로그래머스 - 이모티콘 할인행사
·
코딩 테스트
문제를 읽고 대략적인 로직은 빠르게 세워졌지만 구현에는 꽤 많은 시간이 소요되었다. 인풋 값이 크지 않아서 시간 초과는 생각하지 않고 풀었다. 먼저 가능한 할인 조합을 만들고 users 배열과 emoticons 배열을 순회하며 계산후 result 배열에 담고 정렬해주었다. 총 1시간 정도 걸렸는데 풀이 시간을 더 빠르게 하고 싶다... 최종 코드 import java.util.*; class Solution { static List list; static int[] dis = new int[] {10,20,30,40}; public int[] solution(int[][] users, int[] emoticons) { int[] answer = new int[2]; list = new ArrayList(..
(Java) 프로그래머스 - 택배상자
·
코딩 테스트
문제 설명부터 Stack을 쓰라고 말하는 것 같았다. 메인 컨베이어 벨트는 Queue로 서브 컨베이어 벨트는 Stack을 이용해서 풀이했다. 90% 풀이 금방 끝냈지만, while문의 종료 조건을 생각하느라 시간이 걸렸다. flag 변수를 이용해서 어떠한 작업도 하지 않는다면 while문을 종료시켜 풀이에 성공했다. 최종 코드 import java.util.*; class Solution { public int solution(int[] order) { int answer = 0; Stack stack = new Stack(); Queue queue = new LinkedList(); for(int i = 1; i
(Java) 프로그래머스 - 롤케이크 자르기
·
코딩 테스트
문제가 간단하지만 시간 제한을 맞추는게 꽤 까다로웠다. 인풋값이 크기 떄문에 O(n^2) 로직은 무조건 시간 초과가 나고, O(n log n) 이내로 작성해야 된다고 생각해서 최종적으로 O(n) 로직으로 풀이에 성공했다. 실패 코드 import java.util.*; import java.util.stream.Collectors; class Solution { public int solution(int[] topping) { int answer = 0; for(int i = 1; i < topping.length; i++) { Set set1 = Arrays.stream(Arrays.copyOfRange(topping, 0, i)) .boxed() .collect(Collectors.toSet()); S..
(Java) 프로그래머스 - 숫자 변환하기
·
코딩 테스트
처음에는 DFS를 이용해서 탐색하는 로직을 시도했다. 그러나 너무 많은 재귀 호출로 인한 스택 오버플로우와 시간 초과가 났다. 최소횟수를 찾는것과 최단거리를 찾는것이 똑같다는 생각이 들어 BFS로 변경했다. 더이상 스택 오버플로우는 나지 않았지만 시간 초과가 나는건 똑같았다. 한참을 고민하다 방문 배열과 똑같은 역할을 하는 Set을 추가해서 문제를 해결할 수 있었다. 최종 코드 import java.util.*; class Solution { public int solution(int x, int y, int n) { int answer = 0; answer = bfs(x, y, n); return answer; } public int bfs(int x, int y, int n) { Queue queue..
(Java) 프로그래머스 - 뒤에 있는 큰 수 찾기
·
코딩 테스트
제한사항을 보고 O(n^2) 로직으로는 100% 시간 초과가 날 것이라고 생각했다. 그래서 O(n) Queue를 이용한 로직을 한참 고민했는데, 결국 해결하지 못해 검색을 통해 힌트를 얻어 해결했다. 최종 코드 import java.util.*; class Solution { public int[] solution(int[] numbers) { int[] answer = new int[numbers.length]; Stack stack = new Stack(); for (int i = numbers.length - 1; i >= 0; i--) { while (!stack.isEmpty()) { if(stack.peek() > numbers[i]) { answer[i] = stack.peek(); brea..
(Java) 프로그래머스 - 연속 부분 수열 합의 개수
·
코딩 테스트
처음에는 단순히 슬라이딩 윈도우를 사용해서 풀려고 시도했다. 그러나 부분 수열의 크기가 고정되어 있지 않아서 풀이에 많은 시간이 걸렸다. 최종 코드 import java.util.*; class Solution { public int solution(int[] elements) { int answer = 0; // 부분 수열 크기 int size = 1; Set set = new HashSet(); // 부분 수열 크기가 elements 길이가 될때까지 반복 while (size
(Java) 프로그래머스 - 공원 산책
·
코딩 테스트
추가된 1단계 문제중 가장 정답률이 낮은 문제였다. 전형적인 그래프 탐색 문제였는데, 한칸씩 이동하며 조건을 검사해야 했지만 한번에 n칸씩 이동한다는걸 뒤늦게 깨닫고 수정하느라 풀이 시간이 많이 늘어났다. 최종 코드 import java.util.*; class Solution { static int startX; static int startY; public int[] solution(String[] park, String[] routes) { int[] answer = new int[2]; // 동서남북 이동할 좌표 map에 삽입 Map map = new HashMap(); map.put("N", new int[]{-1, 0}); map.put("E", new int[]{0, 1}); map.put(..