처음에 시간이랑 분을 따로 Int형으로 나눠서 생각했다. 그래서 나온 복잡한 처음 정답코드...근데 너무 복잡해서 gpt한테 물어보니 분으로 바꿔서 접근하면 쉽게 풀 수 있다고 했다. 그래서 두가지 방식으로 구현해보았다.
class 동영상재생기 {
public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
String[] video=video_len.split(":");
int v_hour=Integer.parseInt(video[0]);
int v_minute=Integer.parseInt(video[1]);
String[] time=pos.split(":");
int hour=Integer.parseInt(time[0]);
int minute=Integer.parseInt(time[1]);
String[] start=op_start.split(":");
int s_hour=Integer.parseInt(start[0]);
int s_minute=Integer.parseInt(start[1]);
String[] end=op_end.split(":");
int e_hour=Integer.parseInt(end[0]);
int e_minute=Integer.parseInt(end[1]);
if(isInRange(hour, minute, s_hour, s_minute, e_hour, e_minute)){
hour=e_hour;
minute=e_minute;
}
for(int i=0;i<commands.length;i++){
if(commands[i].equals("next")){
if(minute>=50){
if(hour<v_hour) {
hour++;
if(hour==v_hour){
if(minute+10-60>=v_minute){
minute=v_minute;
}else minute=minute+10-60;
}else minute=minute+10-60;
}
else {
if(minute+10<v_minute){
minute+=10;
}else{
minute=v_minute;
}
}
}else{
if(hour==v_hour){
if(minute+10<v_minute){
minute+=10;
}else{
minute=v_minute;
}
}else{
minute+=10;
}
}
}else{ //prev
if(minute<10){
if(hour>0) {
hour--;
minute = minute - 10 + 60;
}
else { //hour==0
minute=0;
}
}else{
minute-=10;
}
}
if(isInRange(hour, minute, s_hour, s_minute, e_hour, e_minute)){
hour=e_hour;
minute=e_minute;
}
//System.out.println(String.valueOf(hour)+":"+String.valueOf(minute));
}
String h=String.valueOf(hour);
String m=String.valueOf(minute);
if(h.length()==1){
h="0"+h;
}
if(m.length()==1){
m="0"+m;
}
return h+":"+m;
}
// 구간 비교 함수
private boolean isInRange(int hour, int minute, int s_hour, int s_minute, int e_hour, int e_minute){
boolean afterStart = (hour > s_hour) || (hour == s_hour && minute >= s_minute);
boolean beforeEnd = (hour < e_hour) || (hour == e_hour && minute <= e_minute);
return afterStart && beforeEnd;
}
}
class 동영상재생기2 {
public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
String[] video=video_len.split(":");
int v_hour=Integer.parseInt(video[0]);
int v_minute=Integer.parseInt(video[1]);
String[] time=pos.split(":");
int hour=Integer.parseInt(time[0]);
int minute=Integer.parseInt(time[1]);
String[] start=op_start.split(":");
int s_hour=Integer.parseInt(start[0]);
int s_minute=Integer.parseInt(start[1]);
String[] end=op_end.split(":");
int e_hour=Integer.parseInt(end[0]);
int e_minute=Integer.parseInt(end[1]);
int v_len=toMinute(v_hour,v_minute);
int cur=toMinute(hour,minute);
int s=toMinute(s_hour,s_minute);
int e=toMinute(e_hour,e_minute);
if(cur>=s && cur<=e){
cur=e;
}
for(String str:commands){
if(str.equals("next")){
cur+=10;
if(cur>v_len) cur=v_len;
}else{ //prev
cur-=10;
if(cur<0) cur=0;
}
if(cur>=s && cur<=e){
cur=e;
}
}
String h=String.valueOf(cur/60);
String m=String.valueOf(cur%60);
if(h.length()==1) h="0"+h;
if(m.length()==1) m="0"+m;
return h+":"+m;
}
static int toMinute(int h,int m){
int minute=(h*60)+m;
return minute;
}
}
분으로 바꿔 접근하니 훨씬 수월하게 풀렸다. 앞으로 문제를 바로 풀기보단 생각하는 시간을 오래 가지고 접근해야겠다.