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
- 싸피
- 코딩테스트실력진단
- 완전탐색
- database
- JPA
- 다익스트라
- 다시보기
- Union Find
- Spring
- 자바
- SWEA
- 백준
- 코드트리
- Java
- DFS
- 기본유형
- 그래프
- 알고리즘
- 그리디
- 유니온파인드
- DP
- 코딩테스트
- 완탐
- BFS
- SSAFY
- 알고리즘기본개념
- 코테
- 부분수열의합2
- 트러블슈팅
- JUnit
Archives
- Today
- Total
HwangHub
시뮬레이션 : 시간/날짜 본문
1. 시간
만약 "2시 5분 ~ 4시 1분"의 경과 시간(elapsedTime)을 측정하고자 한다면, 가장 단순하게는 다음과 같이 시뮬레이션 코드를 작성할 수 있다.
public class Main {
public static void main(String[] args) {
int hour = 2, mins = 5;
int elapsedTime = 0;
while(true) {
if(hour == 4 && mins == 1)
break;
elapsedTime++;
mins++;
if(mins == 60) {
hour++;
mins = 0;
}
}
System.out.print(elapsedTime);
}
}
하지만 위 방식은 비효율적이며, 위와 같이 단순히 특정 두 시점간의 경과 시각을 알고 싶다면 0시0분을 기준으로 누적합을 이용하는 방식을 적용하면 더욱 간단해진다. 다음은 두 시점 h1 : m1 과 h2 : m2 간의 경과 시각을 알아내는 간단한 로직이다.
int elapsedTime1 = h1*60 + m1;
int elapsedTime2 = h2*60 + m2;
int ans = elapsedTime2 - elapsedTime1;
System.out.println(ans);
2. 날짜
날짜도 마찬가지이다. 2월 5일부터 4월 1일까지 며칠이 흘러야 하는지 알아보기 위해서는 다음과 같이 시뮬레이션 코드를 작성해볼 수 있다. 이 때, 날짜의 경우 각 월마다 며칠인지 미리 배열로 할당해두면 편하다.
public class Main {
public static void main(String[] args) {
int month = 2, day = 5;
int elapsedDays = 0;
// 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
int[] num_of_days = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
while(true) {
if(month == 4 && day == 1)
break;
elapsedDays++;
day++;
if(day > num_of_days[month]) {
month++;
day = 1;
}
}
System.out.print(elapsedDays);
}
}
하지만 이 또한 누적합을 이용하는 방식을 사용한다면 더욱 쉽고 빠르게 답을 도출해낼 수 있다.
int[] daysOfMonths = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int elapsedDate1 = 0;
for (int i = 0; i < m1; i++) elapsedDate1 += daysOfMonths[i]; // 지난달까지 누적 월 만큼 일수 더하기
elapsedDate1 += d1; // 이번달 일수 더하기
int elapsedDate2 = 0;
for (int i = 0; i < m2; i++) elapsedDate2 += daysOfMonths[i]; // 지난달까지 누적 월 만큼 일수 더하기
elapsedDate2 += d2; // 이번달 일수 더하기
int ans = elapsedDate2 - elapsedDate1 + 1; // 두 날을 모두 포함하는 개념이므로 '차' + 1
System.out.println(ans);
위 과정은 위의 시간처럼 누적합을 사용한 개념이다.
'CS-STUDY > 자료구조 & 알고리즘' 카테고리의 다른 글
시간복잡도 (0) | 2023.07.21 |
---|---|
코딩테스트 시작 전 유형 익히기 (0) | 2023.07.11 |
[그래프] 인접 행렬, 인접 리스트 (스크랩) (0) | 2023.07.11 |
배열을 다룰 때 인풋 범위가 음수 포함이라면 (0) | 2023.07.08 |
BFS와 DFS (0) | 2023.05.19 |
Comments