본문 바로가기

코딩테스트

(66)
[JAVA] 백준 2108 - 통계학 🤔 문제 접근 구현 문제인 통계학 문제이다. 어려운 문제는 아니었지만 산술 평균쪽과 최빈값 계산에 있어서 살짝 헤맸다. 산술 평균을 구할 때 데이터 형식을 int로 하여 계산할 경우 예를 들어 전체 합 / N 의 값이 -1.8일 때 -1로 나올 수 있다. 따라서 double 형으로 계산하고 Math.round 메소드를 통해 소수 첫째자리에서 반올림 한 뒤 int 형으로 변환하여 값을 반환해주자. 또한 최빈값을 구하는 과정은 각 숫자들을 map에 집어넣고 가장 많이 나온 횟수인 maxCount를 구한 뒤, key의 value가 maxCount와 같은 key들을 찾아내도록 했다. 이때 key의 개수가 2개 이상이라면 두번째로 작은 값을 반환해주었다. key들을 구하고 다시 key들을 순회하며 2번째로 작은 ..
[JAVA] 백준 13549 - 최단 경로 다익스트라 알고리즘을 공부하며 대표 문제인 최단 경로 문제를 풀어보았다. BFS와 비슷한 느낌이 들었지만 각 노드의 가중치의 최소를 계속해서 갱신해주는 것이 새로웠다. 🤔 문제 접근 각 노드들의 가중치 정보는 Node 클래스를 하나 생성하여 저장하도록 했다. 뭔가 문제를 풀면서 느끼는 건데 주어지는 데이터 형식이 복잡해 어떤 자료구조를 사용해야 할지 애매하다면 클래스를 생성해서 데이터를 저장하는 형식이 좋은 것 같다. 그리고 다익스트라 알고리즘 매커니즘 상, 갈 수 있는 노드 중 아직 방문하지 않았고 최소 가중치인 노드들을 먼저 탐색해야 하므로 add할 때 마다 정렬 해주는 우선순위 큐를 이용했다. 이때 가중치가 정렬의 기준이 되므로 Node 클래스에서 Comparable를 상속 받고 정렬 조건을 가중치..
[SQL] 프로그래머스 - 재구매가 일어난 상품과 회원 리스트 구하기 🤔 배운 것 COLUMN 들을 그룹화 하기 : GROUP BY 그룹의 조회 조건을 세우기 : HAVING COUNT, AVG, SUM, MAX, MIN등으로 조회한 데이터의 양, 평균, 합, 최대, 최소를 구할 수 있다. // USER_ID 와 PRODUCT_ID를 COLUMN으로 하는 테이블을 만들 것이므로 SELECT USER_ID, PRODUCT_ID // ONLINE_SALE 테이블에서 조회할 것이므로 FROM ONLINE_SALE // 어떤 USER가 재구매한 내역을 조회할 것이기 때문에 GROUP BY 1,2 -> USER_ID, PRODUCT_ID 와 동일 // 재구매 한 물품이면 해당 USER가 구매한 PRODUCT_ID가 2개 이상일 것이므로 // 그룹화 한 것의 PRODUCT_ID > ..
[SQL] 프로그래머스 - 3월에 태어난 여성 회원 목록 출력하기 🤔 배운 것 SQL 문에서 DATA FORMAT을 설정하는 것, COLUMN 값이 NULL인 경우 출력 대상에서 제외하는 것 // 전체 COLUMN 에서 4가지 COLUMN만 조회한다 SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH FROM MEMBER_PROFILE; // 이때 DATE_OF_BIRTH의 DATA_FROMAT을 년-월-일로 맞춰줘야한다. // 풀면서 알게된 것인데 %대문자 인 것과 %소문자 인 것이 다르다 // 예) %M 이 3월이면 'march', %m이면 03 이라고 결과가 출력된다 SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') FROM MEMB..
[SQL] 프로그래머스 - 12세 이하인 여자 환자 목록 출력하기 🤔 배운 것 COLUMN 값이 NULL이면 지정한 형식으로 출력하는 것, 정렬 기준을 여러개 세우는 것 // 먼저 전체 column에 대해 조회해야 하기 때문에 SELECT * FROM PATIENT; // 문제의 조건인 12세이면서 여자아이 이므로 SELECT * FROM PATIENT WHERE AGE
[JAVA] 백준 13549 - 숨바꼭질 3 🤔 문제 접근 +1, -1, *2 연산만을 이용해 n이 k가 될 때 까지의 최소 비용을 구하는 문제이다. *2는 -1,+1과 달리 순간이동이기 때문에 시간이 소요되지 않는 것에 유의해야 한다. Info 클래스를 생성하여 위치와 시간을 저장하도록 했다. 🚨CODE import java.util.*; import java.io.*; /* * 구해야하는 것 : n에서 k까지의 최단 시간 * 움직일 수 있는 방법 : 현재 위치에서 -1, +1, *2 * 만약 도착지점을 초과한 경우 뒤로 가야하며 이때는 -1 연산밖에 없음 앞으로가는 것은 +1, *2 * +1, -1은 1초가 소요되나 *2는 0초가 소요된다. */ public class Main { static int max = 100000; static int..
[JAVA] 백준 20207 - 달력 🤔 문제 접근 구현 알고리즘의 달력 문제다. 연속된 각 일정들의 (최대 연속 일수) * (일정이 가장 많이 겹친 횟수) 로 각 일정들이 만들어내는 직사각형의 넓이를 구하면 되는 문제다. 우선 순위 큐를 이용하고 정렬 기준을 재정의하여 시작 일정이 빠른 순으로 각 일정들의 시작과 종료 일을 배열에 담아 큐에 저장했다. 그리고 이전 시작(preStart) 이전 종료(preEnd)를 기억해두고 큐에서 일정들을 하나씩 빼오도록 했다. 빼온 일정이 이전 일정과 연속된 일정인 경우 해당 일정의 최대 가로 길이를 구하기 위해 preEnd와 curEnd의 대소 비교를 통해 최대값으로 갱신하도록 했다. 하나의 연속된 일정의 넓이는 연속되지 않은 일정이 등장할 때 구하도록 했다. 가로 길이는 curEnd - preStar..
[JAVA] 백준 2615 - 오목 🤔 문제 접근 정답 비율에서 알 수 있듯이 상당히 어려운 문제였다. 초기 상하좌우, 대각선 4방향으로 총 8가지 방향 벡터를 선언하고 재귀 호출을 통해 놓여진 돌의 개수가 5개인지 확인하도록 했다. 놓인 돌이 5개고 같은 방향으로 한번 더 진행 했을 때 같은 돌이 놓여져 있거나 초기 위치에서 한 칸 뒤로 갔을 때 같은 돌이 놓여져 있는 경우 놓인 돌이 6개 이상이 되므로 다른 오목을 찾게 끔 풀었다. 하지만 초기 풀이에서 놓친 것이 몇 가지 있었는데 만약 오목일 경우 오목을 이루는 돌들 중 가장 왼쪽, 그리고 윗쪽에 있는 돌의 좌표를 출력해야 했다. 이 점을 놓치고 초기 좌표만 정답으로 출력하게 끔 했고 당연히 계속 틀렸다. 또한 방향 벡터가 8개일 필요없이 4가지 방향을 가지고 반대 방향일 경우를 고려..

반응형