Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 인접 행렬
- 자바
- 프로그래밍 언어
- 자료구조
- C
- Java
- 코딩테스트
- 코드트리
- 개발자취업
- 파이썬
- 개발자루틴
- 자바스크립트
- 코딩테스트준비
- 오블완
- til
- 웹
- 연결 리스트
- 코테공부
- 데이터베이스
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 코딩테스트사이트추천
- 프로그래머스
- 99클럽
- 항해99
- 알고리즘
- 운영체제
- 1일1코테
- 갭체크
- 플로이드-워셜
- 티스토리챌린지
Archives
- Today
- Total
와드의 블로그
2979번: 트럭 주차 본문
문제
상근이는 트럭을 3대 가지고 있으며, 트럭을 주차장에 주차할 때 대수에 따라 주차 요금이 할인됩니다.
- 트럭을 1대 주차할 때는 1분에 한 대당 A원을 냅니다.
- 트럭을 2대 주차할 때는 1분에 한 대당 B원을 냅니다.
- 트럭을 3대 주차할 때는 1분에 한 대당 C원을 냅니다.
A, B, C와 3대의 트럭이 주차장에 도착한 시간과 떠난 시간이 주어졌을 때, 상근이가 내야 하는 주차 요금의 총합을 구하는 문제입니다.
- 입력:
- 첫째 줄에 주차 요금 A, B, C가 주어집니다. (1 ≤ C ≤ B ≤ A ≤ 100)
- 다음 세 개의 줄에는 각 트럭이 주차장에 도착한 시간과 떠난 시간이 주어집니다. (시간은 1부터 100 사이의 정수)
- 출력: 상근이가 내야 하는 주차 요금
링크: https://www.acmicpc.net/problem/2979
풀이
이 문제는 주어지는 시간의 범위가 1부터 100까지로 매우 작기 때문에, 크기가 101인 배열을 선언하여 각 분(minute)마다 주차된 트럭의 대수를 누적하는 방식으로 쉽게 풀 수 있습니다.
- 요금 배열 저장: 1대, 2대, 3대일 때의 한 대당 요금을 fee 배열에 차례대로 저장합니다.
- 시간대별 주차 대수 누적: 각 트럭의 도착 시간(s)부터 떠난 시간(e) 전까지 반복문을 돌며 cnt 배열의 값을 1씩 증가시킵니다.
- 주의할 점은 트럭이 떠난 시간(e)에는 주차장에 트럭이 없는 것이므로, j < e 로 설정하여 떠난 시간 직전까지만 카운트해야 합니다.
- 최종 요금 계산: 시간 배열을 1부터 100까지 순회하며 해당 시간에 주차된 트럭이 있다면(cnt[i] > 0), 요금을 계산해 정답에 더해줍니다.
- 이때 계산식은 주차된 트럭 수 * 한 대당 요금이 되므로, cnt[i] * fee[cnt[i] - 1] 한 줄로 아주 깔끔하게 처리할 수 있습니다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
// 1대, 2대, 3대 주차 시 한 대당 요금 배열 (A, B, C)
int[] fee = new int[3];
for (int i = 0; i < 3; i++) {
fee[i] = Integer.parseInt(st.nextToken());
}
// 시간대별 주차된 트럭의 대수를 기록할 배열 (시간 범위 1~100)
int cnt[] = new int[101];
// 3대의 트럭에 대해 주차 시간 기록
for (int i = 0; i < 3; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
// 도착 시간부터 떠난 시간 직전(e-1)까지만 카운트 증가
for (int j = s; j < e; j++) {
cnt[j]++;
}
}
int ans = 0;
// 1분부터 100분까지 순회하며 요금 정산
for (int i = 0; i <= 100; i++) {
if (cnt[i] == 0) continue;
// 총 요금 += (해당 시간의 트럭 대수) * (해당 대수의 1대당 주차 요금)
ans += cnt[i] * fee[cnt[i] - 1];
}
bw.write(ans + "");
bw.flush();
}
}
알고리즘 분류
구현 (Implementation), 시뮬레이션 (Simulation)
'PS > B.O.J' 카테고리의 다른 글
| 11655번: ROT13 (0) | 2026.03.19 |
|---|---|
| 1159번: 농구 경기 (0) | 2026.03.19 |
| 10988번: 팰린드롬인지 확인하기 (0) | 2026.03.19 |
| 10808번: 알파벳 개수 (0) | 2026.03.19 |
| 2309번: 일곱 난쟁이 (0) | 2023.03.04 |