조건에 맞는 도서와 저자 리스트 출력하기 - 문제 링크
SELECT
BOOK.BOOK_ID,
AUTHOR.AUTHOR_NAME,
DATE_FORMAT(BOOK.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM
BOOK
INNER JOIN
AUTHOR
ON
BOOK.AUTHOR_ID = AUTHOR.AUTHOR_ID
WHERE
BOOK.CATEGORY = '경제'
ORDER BY
BOOK.PUBLISHED_DATE ASC;
/*
기본 시간 : 180분
기본 요금 : 5000(원)
단위 시간 : 10(분)
단위 요금 : 600(원)
*/
/*
fees[0] = 기본 시간(분)
fees[1] = 기본 요금(원)
fees[2] = 단위 시간(분)
fees[3] = 단위 요금(원)
*/
/*
`records`의 각 원소는 "시각 차량번호 내역" 형식의 문자열(공백으로 구분)
시각은 `HH:MM` 형식의 길이가 5인 문자열
차량번호는 자동차를 구분하기 위한, `0` ~ `9`로 구성된 길이 4인 문자열
내역은 `IN` 또는 `OUT`의 길이가 2 또는 3인 문자열
`records`의 원소들은 시각을 기준으로 오름차순으로 정렬됨
`records`는 하루 동안의 입/출차된 기록만 담고 있음.
마지막 시각(23:59)에 입차되는 경우는 입력으로 주어지지 않음.
*/
import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
int std_time = fees[0];
int std_pay = fees[1];
int per_time = fees[2];
int per_pay = fees[3];
//key: 차량번호, value: 입장 시간
Map<Integer, Integer> map = new HashMap<>();
//key: 차량번호, value: 주차 요금
Map<Integer, Integer> result = new TreeMap<>();
// 주차기록 처리하기
for (String data : records) {
String[] temp = data.split(" ");
int time = cal_time(temp[0]);
int car_num = Integer.parseInt(temp[1]);
String state = temp[2];
if (state.equals("OUT")) {
int start = map.get(car_num);
int use_time = time - start;
if (result.containsKey(car_num)) {
int a = result.get(car_num);
use_time += a;
}
result.put(car_num, use_time);
map.remove(car_num);
continue;
}
map.put(car_num, time);
}
// 아직 안나간 차량 처리
for (int num : map.keySet()) {
Integer d = map.get(num);
d = d == null ? 0 : d;
int start = d.intValue();
int use_time = 1439 - start;
Integer e = result.get(num);
e = e == null ? 0 : e;
int total = e.intValue();
result.put(num, total + use_time);
}
// 출력하기
int[] answer = new int[result.size()];
int i = 0;
for (int data : result.keySet()) {
int time = result.get(data);
if (time <= std_time) {
time = std_pay;
} else {
time = std_pay + (int) Math.ceil((double) (time - std_time) / per_time) * per_pay;
}
answer[i] = time;
i++;
}
return answer;
}
public int cal_time(String time) {
String[] temp = time.split(":");
int hour = Integer.parseInt(temp[0]) * 60;
int min = Integer.parseInt(temp[1]);
return hour + min;
}
}
문제 풀이에 도움을 주신 류창님께 감사의 말씀 전합니다.
출력 결과 : 차량 번호가 적은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 한다.
목표 : 차량 기록을 모두 처리한 이후에 각 차량마다 주차요금을 구하는 문제 (차량 번호를 기준으로 오름차순한다)
[1] 기본 시간, 기본 요금, 단위 시간, 단위 요금을 보기 쉽게 분리하였다.
그런 다음, 2개의 Map을 준비했다.
차량 번호를 오름차순으로 정렬해야하기 때문에 TreeMap으로 설정했다.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Collections;
class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0;
Map<Integer, Integer> map = new HashMap<>();
// 크기별로 몇 개 있는지 map에 저장함
for (int tan : tangerine) {
map.put(tan, map.getOrDefault(tan, 0)+1);
}
// 개수(value)가 많은 순으로 정렬
List<Integer> list = new ArrayList<>(map.values());
Collections.sort(list, Collections.reverseOrder());
// 개수가 많은 순부터 사용
for (Integer a : list) {
if(k < 1)
return answer;
k -= a;
answer++;
}
return answer;
}
}
귤의 크기(key)와 개수(value)를 Map에 저정한 다음, 개수가 많은 순부터 사용하여 k개를 채우면 되는 문제였다.
HashMap()의 getOrDefault(key, defaultValue)
는 지정된 key의 값(객체)을 반환한다. key가 없으면 지정된 defaultValue로 지정된 객체를 반환한다.
class Solution {
public int solution(int n) {
int answer = 0;
for(int i = 1; i <= n; i++) {
int sum = 0;
for(int j = i; j <= n; j++) {
sum += j;
if(sum == n) {
answer++;
break;
} else if(sum > n) {
break;
}
}
}
return answer;
}
}
연속한 자연수들로 표현 하는 방법
을 어떻게 풀이할지 생각하다가 이중 for문으로 구현했다.import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] dir = {
{-1, 0}, {1, 0}, {0, -1}, {0, 1}
};
static int[][] map;
static int[][] dp;
static int N, ans;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = stoi(br.readLine());
ans = 0;
map = new int[N][N];
dp = new int[N][N];
// 맵 정보 입력
for(int r = 0 ; r < N ; ++r) {
st = new StringTokenizer(br.readLine());
for(int c = 0 ; c < N ; ++c) {
map[r][c] = stoi(st.nextToken());
}
}
// DP 테이블 갱신과 동시에 최댓값 갱신
// DP 테이블은 해당 지역에서 이동할 수 있는 최댓값이다.
for(int r = 0 ; r < N ; ++r) {
for(int c = 0 ; c < N ; ++c) {
int way = dfs(r, c);
ans = way > ans ? way : ans;
}
}
System.out.println(ans);
}
private static int dfs(int r, int c) {
// 이미 갱신된 지역은 바로 그 값을 리턴한다.
if(dp[r][c] != 0) return dp[r][c];
// 1로 초기화
dp[r][c] = 1;
// 해당 지점 기준 4방 탐색
for(int d = 0 ; d < 4 ; ++d) {
int nr = r + dir[d][0];
int nc = c + dir[d][1];
if(nr >= N || nr < 0 || nc >= N || nc < 0) continue;
// 다음 지역은 이전 지역보다 커야한다.
if(map[nr][nc] > map[r][c]) {
// 기존의 값과 새로 탐색한 값 중에 최댓값으로 갱신
dp[r][c] = Math.max(dp[r][c], dfs(nr, nc) + 1);
}
}
return dp[r][c];
}
private static int stoi(String s) {
return Integer.parseInt(s);
}
}