(Java) 프로그래머스 - 개인정보 수집 유효기간
·
코딩 테스트
카카오 문제치고 쉬운 문제였다. 인풋 값도 적어서 시간 초과를 생각하지 않고 편한 마음으로 풀었다. Date와 SimpleDateFormat를 이용해서 계산하는 방법도 생각했지만 그냥 계산하는게 더 간단해 보여서 사용하지는 않았다. 로직 먼저 terms 배열을 순회하며 map에 약관종류와 유효기간을 넣어준다. 그리고 privacies를 순회하며 약관 종류에 맞는 유효기간을 가져와 cal 메서드를 호출한다. 유효기간이 1이 될 때까지 날짜를 계산하여 년월일을 일자로 바꾸어 현재 날짜와 비교한다. cal 메서드의 반환값이 false이면 list에 추가하고 모든 순회가 끝나면 stream을 이용해 배열로 변환한다. 최종 코드 import java.util.*; class Solution { public int..
(Java) 프로그래머스 - 둘만의 암호
·
코딩 테스트
문제 해결 로직은 쉬웠지만 깔끔하게 풀지는 못한 것 같다. 스트림을 이용하면 조금 더 보기 좋게 코드를 작성할 수 있을 것 같은데 아직 스트림이 익숙하지 않다.. 로직 제시된 String을 char 배열로 바꾸고 contains() 메서드를 이용하기 위해 skipArr을 list에 넣어준다. arr 배열을 순회하며 문자를 다음 문자로 바꾸어 'z' 이후 문자인지 확인하여 이후 문자라면 'a'로 바꿔준다. 그리고 list에 넘어가야할 문자가 있는지 확인한다. 바꾼 문자가 list에 있다면 cnt를 증가시키지 않고 넘어가고, 없다면 cnt를 증가시켜 cnt가 index와 같아질 때까지 문자를 바꾼다. 마지막으로 바꾼 문자를 StringBuilder에 추가하면 된다. 최종 코드 import java.util...
(Java) 프로그래머스 - 카드 뭉치
·
코딩 테스트
마스터즈 코스를 진행하며 CS 공부하기에도 시간이 너무 부족하지만 하루에 한 문제씩 알고리즘 문제 풀기를 다시 시작하려고 한다. 요즘 프로그래머스에 문제들이 많이 추가되고 있다. 예전에 프로그래머스 2단계 문제까지 전부 다 풀었었는데 추가된 문제가 많아서 전부 다 풀어보고 3단계로 가야겠다! 로직 사실 문제가 너무 간단해서 로직을 크게 생각하지 않았다. goal 배열을 순회하면서 cards1 배열과 cards2 배열을 동시에 탐색하면 된다. 각 cards 배열의 인덱스를 만들고 배열의 크기를 벗어나지 않으면서 goal 문자와 같으면 인덱스를 추가하고 다음 문자로 넘어간다. 만약 어떤 cards 배열의 어떤 문자도 일치하지 않으면 바로 No를 리턴해서 탐색을 종료한다. 모든 탐색이 종료되면 문자열을 만들 ..
(Java) 프로그래머스 - 베스트앨범
·
코딩 테스트
한번에 로직이 세워지지 않았던 문제이다. HashMap에 익숙해졌다고 생각했지만 values를 기준으로 내림차순 정렬하는데 어려움을 겪었다. 로직 먼저 genres와 play값을 HashMap에 넣어 각 장르별 플레이 횟수를 센다. 그리고 keySet을 리스트에 넣어 플레이 횟수별로 내림차순 정렬한다. 정렬된 list의 값을 순회하면서 첫번째와 두번째로 많이 재생된 노래의 인덱스를 result 리스트에 넣고 마지막으로 배열로 복사해서 반환하면 된다. 최종 코드 import java.util.*; class Solution { public int[] solution(String[] genres, int[] plays) { List result = new ArrayList(); // 각 장르별로 HashMa..
(Java) 프로그래머스 - 단속카메라
·
코딩 테스트
오랜만에 문제를 읽고 어떻게 풀어야 하는지 감이 오지 않았다. 문제 유형이 그리디로 분류되어 있었지만, 로직 자체가 생각나지 않았다. 결국 고민하다가 검색을 통해서 힌트를 얻었다. 로직 이 문제의 키포인트는 정렬이다. 각 자동차의 진출 시간인 routes [i][1] 값을 기준으로 정렬하면 문제를 쉽게 해결할 수 있다. 왜냐하면 n번째 자동차의 진출시간과 n+1 자동차의 진입시간을 비교해 n+1번째 자동차의 진입시간이 n번째 자동차의 진출 시간 이전이라면 카메라의 숫자를 늘릴필요가 없어 다음 차량으로 넘어가면 되고, n+1번째 자동차의 진입시간이 n번째 자동차의 진출 시간 이후라면 min의 값을 바꾸고 카메라의 숫자를 +1 하면 되기 때문이다. 최종 코드 import java.util.*; class S..
(Java) 프로그래머스 - 등굣길
·
코딩 테스트
문제를 읽고 DFS / BFS로도 풀 수 있겠다는 생각을 했다. 그런데 문제 유형이 DP로 분류되어 있어서 시간 초과가 나지 않을까 싶어서 DP로 풀수 있는 방법을 생각해서 해결했다. 로직 먼저 m x n인 arr 배열을 만들고 웅덩이를 -1로 초기화한다. 그리고 첫 번째 행과 열이 아니면 이전 행과 열의 값을 더하며 탐색을 진행한다. 최종적으로 마지막 행과 열에는 도달할 수 있는 방법의 개수가 값으로 들어있게 된다. 최종 코드 class Solution { public int solution(int m, int n, int[][] puddles) { int answer = 0; // n x m 배열 초기화 int[][] arr = new int[n][m]; // 시작점은 1 arr[0][0] = 1; ..
(Java) 프로그래머스 - 단어 변환
·
코딩 테스트
DFS / BFS 둘 중 편한 것을 선택해서 풀 수 있는 문제였다. DFS가 더 편해 보여서 DFS를 이용해서 풀었는데 로직을 설계하는 게 어려워서 꽤 고민하며 풀었었다. 테스트 케이스도 5개밖에 되지 않고, 입력값이 크지 않아서 수행 시간은 생각하지 않고 풀었다. 로직 먼저 words와 동일한 크기로 방문 배열을 초기화한다. 다음으로 target 문자열이 words 배열에 있는지 검사한다. target 문자열이 words에 없다면 바로 0을 반환하고 탐색하지 않는다. 그리고 DFS 탐색을 시작하는데 begin 문자열이 target 문자열과 몇 글자가 다른지 확인한다. 만약 한 글자만 다르다면 한 번만 변환하면 되므로 리스트에 cnt + 1 값을 저장한다. 한 글자 이상이 다르다면 words 배열을 순회..
(Java) 프로그래머스 - 혼자 놀기의 달인
·
코딩 테스트
문제가 잘 이해되지 않아서 몇 번을 읽었다. 이해하고 보니 결국 연결되어 있는 노드의 개수를 저장하고 최댓값 2개를 꺼내서 곱을 반환하면 되는 문제였기에 DFS를 이용해서 풀이했다. 로직 cards 배열의 크기가 처음 선택하는 카드의 숫자이기 때문에 visited 배열의 크기를 n으로 설정한다. 첫 번째 상자부터 n번째 상자까지 순회하며 방문하지 않았다면 DFS 메서드를 호출하고 재귀 탐색한다. 열었던 상자까지 도달하면 상자의 개수를 우선순위 큐에 넣고 리턴한다. 모든 순회가 끝나면 우선순위큐의 첫 번째 두 번째 값을 곱해서 answer를 반환한다. 이때 우선순위큐의 사이즈가 1이면 첫 번째 상자 그룹 하나밖에 없다는 의미임으로 0을 반환한다. 최종 코드 import java.util.*; class S..
(Java) 프로그래머스 - 할인 행사
·
코딩 테스트
새롭게 나온 레벨 2 문제인데 입력값이 크지도 않고 로직이 복잡한 것도 아니라서 어렵지 않다. 어느 기업인지는 기억이 안나지만 코딩 테스트에서 비슷한 문제를 풀었던 기억이 있다. 로직 i일부터 10일동안 할인 품목을 map에 넣는다. 그리고 각 품목을 비교하는데 하나라도 number보다 작으면 안 되므로 작은 값이 나오면 탐색을 중단한다. 또한 map에 want 품목이 하나라도 없으면 안 되므로 마찬가지로 탐색을 중단한다. 모든 조건이 맞으면 answer 값을 증가시킨다. 최종 코드 import java.util.*; class Solution { public int solution(String[] want, int[] number, String[] discount) { int answer = 0; //..