알고리즘/PROGRAMMERS42 대충 만든 자판(Lv.1) 문제 설명 입출력 예시 요약 주어진 keymap의 문자열에 들어있는 문자들을 최대한 적게 눌러서 targets에 있는 단어 만들기 풀이 접근 방식 1. targets의 문자열을 이루고 있는 문자를 하나씩 keymap에서 조사 → .indexOf() 메소드로 주어진 keymap을 모두 조사해 최소값을 찾는다. 2. keymap에 없는 문자를 포함하는 경우 -1을 return → 스트림의 최종 처리 기능인 .orElse() 메소드를 통해 -1을 리턴 코드리뷰 import java.util.*; public class Solution { public int[] solution(String[] keymap, String[] targets) { List list = new ArrayList(); for(int i.. 2024. 4. 11. 상품을 구매한 회원 비율 구하기(DB) 문제 설명 입출력 예시 요약 2021년 가입자 중에서 구매를 한 회원수와 그 비율을 구매한 년, 월 별로 출력 풀이 접근 방식 1. 유저 아이디와 가입년도를 기준으로 조인 → 두 테이블의 USER_ID가 같고 가입년도가 21년인 조건으로 WHERE절 작성 2. 년, 월 별로 그룹화 → SALES_DATE의 YEAR과 MONTH를 기준으로 GROUP BY절 작성 3. 중복 조회 데이터 제외 → 구매 횟수가 아닌 구매 여부를 따져야 하므로 DISTINCT로 중복된 USER_ID 제외 4. 비율 구하기 → 분모로 사용할 2021년 가입자 수를 서브쿼리를 통해 구하고, ROUND를 통해 소수점 두 번째 짜리까지만 반올림 5. 년, 월 별로 정렬 → ORDER BY 1, 2를 통해 년, 월 순으로 정렬(디폴트는 .. 2024. 3. 28. n진수 게임(Lv.2) 문제 설명 입출력 예시 요약 양의 정수(0포함) 하나씩 n진수로 변환 후 내 순서의 숫자로만 이루어진 배열 만들기 풀이 접근 방식 1. n진수 변환 메소드 trans() → 0부터 1씩 증가시키며 n진수로 변환 → 10~15는 A~F로 변환 2. 내 차례에 해당하는 숫자만 고르기 → 인원수가 m이라면, int i = 0부터 시작하는 for문에서 i를 m으로 나눈 나머지에 1을 더한 수 (i % m + 1)가 자신의 차례와 같은지 비교 3. 턴 수가 넘어간 문자는 자르기 → t번 차례까지만 구하면 되므로, 그 이상의 문자들은 substring으로 제거 코드리뷰 import java.util.*; class Solution { int max;// 변환할 n진수의 max length public String .. 2024. 3. 28. 게임 맵 최단거리(Lv.2) 문제 설명 입출력 예시 요약 상대 진영에 도착하는 최단거리 구하기(막혀있으면 -1 return) 풀이 접근 방식 1. 주어진 이차원 배열 형태로 미로 구성 → 미로 전체를 둘러싸기 위해 행과 열의 크기에 각각 2를 더한 만큼의 maze(boolean 2차원 배열) 생성 → 행의 개수, 열의 개수 만큼 이중 반복문을 통해 maze에 미로 표시 2. bfs를 활용해 최단 경로 구하기 → 상하좌우로 이동할 수 있는 좌표가 담긴 directions (int 2차원 배열) 생성 → 현재 좌표와 이동한 거리를 인스턴스로 갖는 Position 클래스 객체를 큐에 담아 FIFO 방식으로 확인 코드리뷰 import java.util.*; // 현재 좌표(row, col)와 이동한 거리(dist)를 인스턴스로 갖는 Pos.. 2024. 3. 27. k진수에서 소수 개수 구하기(Lv.2) 문제 설명 입출력 예시 요약 k진수에서 조건에 맞는 소수 개수 구하기 풀이 접근 방식 1. 10진수 n을 k진수로 변환 → 진수 변환 메소드 trans()를 만들어 변환 2. 조건에 맞는 소수 개수 구하기 → P는 각 자릿수에 0을 포함하지 않기 때문에 0을 기준으로 split 후 소수 판별 → isPrime() 메소드를 통해 판별 코드리뷰 import java.util.*; class Solution { String str = ""; // 진수변환 메소드 public void trans(int n, int k) { boolean run = true; List list = new ArrayList(); while(run) { list.add(0, String.valueOf(n % k));// 나눈 나머지.. 2024. 3. 25. 압축(Lv.2) 문제 설명 입출력 예시 요약 현재 입력과 일치하는 가장 긴 단어의 색인 번호를 출력하고, 현재 입력에 다음 글자 하나를 더해 사전에 추가한다. 풀이 접근 방식 1. 크기가 1인 단어들로 사전 초기화 → char 타입의 변수에 'A'를 저장 후 'Z'까지 ++ 해가며 map에 담는다. 2. 사전에서 현재 입력과 일치하는 가장 긴 문자열 찾기 → 주어진 문자열 msg의 길이부터 하나씩 줄여가며 사전에서 일치하는 단어 찾기(완전 탐색) 3. 사전에서 일치하는 가장 긴 문자열을 자르고 난 후 남은 msg의 길이 확인 → 0인 경우 while문 탈출 → 1인 경우 map.get(msg)를 통해 찾은 value를 list에 담고 while문 탈출 → 2 이상인 경우 msg의 첫 번째 문자를 잘라서 현재 입력과 합친.. 2024. 3. 25. 이전 1 2 3 4 5 ··· 7 다음