1. ๋ฌธ์ ์ค๋ช ๐
๋์์ ์ฌ์๊ธฐ์ ์๋์ ๊ตฌํํ๋ ๊ฐ๋จํ ๋ฌธ์ ์ด๋ค.skip
: ํ์ฌ user์ ์์น๊ฐ ์คํ๋ ๊ตฌ๊ฐ ์์ด๋ฉด, ์คํ๋์ด ๋๋๋ ์ง์ ์ผ๋ก JUMP ํ๋ค.next
: 10์ด ๋ค๋ก ์์น๋ฅผ ์์ง์ธ๋ค. ๋ง์ฝ ๋จ์ ๋์์ ์๊ฐ์ด 10์ด ๋ฏธ๋ง์ด๋ฉด ๋์์์ ๋ง์ง๋ง ์์น๋ก ๊ฐ๋ค.prev
: 10์ด ์์ผ๋ก ์์น๋ฅผ ์์ง์ธ๋ค. ๋ง์ฝ์ ํ ์์น๊ฐ 10์ด ๋ฏธ๋ง์ธ ์ํ์์ prev๋ฅผ ๋๋ฅด๋ฉด ๋์์ ๋งจ ์ฒ์ ์์น๋ก ์์ง์ธ๋ค. (์ฒซ ์์น 0๋ถ 0์ด)
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: SIMULATION
๊ทธ๋ฅ ๊ตฌํ ๋ฌธ์ ์ด๋ค. ํ ๊ฐ์ง ๊น๋ค๋ก์ด ๊ฒ์ ์ ๋ ฅ์ด String์ผ๋ก ์ฃผ์ด์ง๊ณ , ๊ทธ๊ฒ์ int๋ก ๋ณํํด ์์ ์ ์ํํด์ผ ํ๋ ์ ๊ณผ ๋ต๋ณ์ ๋ String ํํ๋ก ๋ณํํ์ฌ ํด์ผํ๋ ์ ์ด๋ค.
(1) ์ฒซ ๋ฒ์งธ ์ ๊ทผ ๋ฐฉ์: Class ์ด์ฉ
์ฒซ ๋ฒ์งธ๋ Video๋ผ๋ ๋ถ(mm)๊ณผ ์ด(ss)๋ฅผ ๋ฉค๋ฒ ๋ณ์๋ก ๊ฐ์ง ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฌธ์ ๋ฅผ ํ์๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์ ๋ฌธ์ ๋ฅผ ์ด๋ ต๊ฒ ํผ ๋ฐฉ์์ด์๋ค. ์๋ํ๋ฉด 60์ด๋ฅผ ์ด๊ณผํ๊ฑฐ๋, 0์ด ๋ฏธ๋ง์ผ๋ก ๋จ์ด์ ธ ๋ถ์ด ๋ฐ๋๋ ๊ฒ์ ์ผ์ผํ ์๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ ์คํ๋ ๊ตฌ๊ฐ์ธ์ง ๊ณ์ฐ๋ ๋ณต์กํ๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฐฉ์์ ์ถ์ฒํ์ง ์๋๋ค.
(2) ๋ ๋ฒ์งธ ์ ๊ทผ ๋ฐฉ์: ๋ถ์ ์ด๋ก ๋ณํํ์ฌ ๊ณ์ฐ
ํด๋น ๋ฐฉ์์ ํ์ฉํ๋ฉด, prev
, next
,skip
๊ณ์ฐ์ด ๊ฐ๋จํ ์ฐ์๋ก ์ฌ์์ ธ์ ๋ฌธ์ ํ๊ธฐ ํจ์ฌ ์์ํ๋ค. ํ์๋ 1๋ฒ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํผ ๋ค, ๋ค๋ฅธ ๋ถ๋ค์ ํ์ด์์ ํํธ๋ฅผ ์ป์ด 2๋ฒ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ๋ค์ ํ์๋ค. 2๋ฒ ๋ฐฉ์์ผ๋ก ํ๋ฉฐ, ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํธ๋ ๋ฐฉ์์ ์๊ฐํ๋ ์ฌ๊ณ
๊ฐ ์ผ๋ง๋ ์ค์ํ์ง ์๊ฒ ๋์๋ค.
์ด์ ๋ ๊ฐ์ง ์ฝ๋๋ฅผ ์๊ฐ ํ๊ฒ ๋ค.
3. ์ฝ๋ ์๊ฐ ๐
(0) ์ฌ์ ์ง์
StringTokenizer
๋ฅผ ํ์ฉํ ์ค ์์์ผ ํ๋ค. ๋ฐฑ์ค์์ ๋ฌธ์ ํ๋ค๋ณด๋ฉด ์์ฃผ ํ์ฉํ๋ ํด๋์ค ์ด๊ธฐ์ ๋ฐ๋ก ๊ฑฑ์ ์ ์ํ์ง๋ง, Spring.split("delim")
์ฒ๋ผ delim์ผ๋ก ๊ฐ์ ๊ตฌ๋ถํ์ฌ ๋ฌธ์์ด์ ์๋ฅด๋ ๋ถ๋ถ์ ์ ๋ชจ๋ฅด์๋ ๋ถ๋ค์ด ๋ง๋ค. ๋ค์์ ํ์๊ฐ ์๋ ์ ์์ ๊ฐ๋ตํ๊ฒ StringTokenizer์ ๋ํด ์ค๋ช
ํ๋ ค๊ณ ํ๋ค. ๋ ์์ธํ ์๊ณ ์ถ์ ๋ถ์ ๊ฒ์ํด๋ณด์๊ธฐ ๋ฐ๋๋ค.
// 1. ์ธ์ 1๊ฐ : ์ด๋ delim์ ์๋์ผ๋ก " "(๊ณต๋ฐฑ)์ด ๋๋ค.
StringTokenizer st = new StringTokenizer(target);
StringTokenizer st = new StringTokenizer("์/ํ ์ ๋ชฉ ๊ธ ํ /์ผ"); // "์ํ", "์", "๋ชฉ", "๊ธ", "ํ /์ผ"
// 2. ์ธ์ 2๊ฐ : ์ค์ ํ delim์ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ์๋ฅธ๋ค.
StringTokenizer st = new StringTokenizer(target, delim);
StringTokenizer st = new StringTokenizer("์/ํ ์ ๋ชฉ ๊ธ ํ /์ผ", "/"); // "์", "ํ ์ ๋ชฉ ๊ธ ํ ", "์ผ"
// 3. ์ธ์ 3๊ฐ : ๋ง์ง๋ง์ boolean ๊ฐ์ ๋ํด ์๋ฅธ ๋ฌธ์์ด ๋ด์ delim ๊ฐ์ ํฌํจํ ๊ฒ์ธ์ง ์ฌ๋ถ๋ฅผ ์ ํ๋ค.
// 1,2๋ฒ์์ ์๋ต๋์๋๋ฐ, 3๋ฒ์งธ ์ธ์์ ๊ธฐ๋ณธ๊ฐ์ false(delim์ ํฌํจ ์ํ๋ค.) ์ด๋ค.
StringTokenizer st = new StringTokenizer(target, delim, boolean);
StringTokenizer st = new StringTokenizer("์/ํ ์ ๋ชฉ ๊ธ ํ /์ผ", "/", true); // "์/", "ํ ์ ๋ชฉ ๊ธ ํ /", "์ผ"
(1) Class ์ด์ฉ
import java.io.*;
import java.util.*;
class Solution {
static Video end;
static Video open_s;
static Video open_e;
public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
// 0. Initialize
StringTokenizer st = new StringTokenizer(video_len, ":");
end = new Video(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
st = new StringTokenizer(op_start, ":");
open_s = new Video(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
st = new StringTokenizer(op_end, ":");
open_e = new Video(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
st = new StringTokenizer(pos, ":");
Video now = new Video(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
for(String order : commands){
now.isInOpening(open_s, open_e);
if(order.equals("next")) now.next(end);
else now.prev();
}
now.isInOpening(open_s, open_e);
return now.toString();
}
}
class Video {
int mm;
int ss;
public Video (int mm, int ss){
this.mm = mm;
this.ss = ss;
}
public void next(Video end) {
this.ss += 10;
if(this.ss >= 60) {
this.ss = this.ss%10;
this.mm += 1;
}
if(this.mm > end.mm || (this.mm == end.mm && this.ss > end.ss)){
this.mm = end.mm;
this.ss = end.ss;
}
}
public void prev() {
this.ss -= 10;
if(this.ss < 0){
this.ss += 60;
this.mm -=1;
}
if(this.mm < 0){
this.mm = 0;
this.ss = 0;
}
}
public void isInOpening(Video open_s, Video open_e){
if(open_s.mm > this.mm || (open_s.mm == this.mm && open_s.ss > this.ss)) return;
if(open_e.mm < this.mm || (open_e.mm == this.mm && open_e.ss < this.ss)) return;
this.mm = open_e.mm;
this.ss = open_e.ss;
return;
}
public String toString() {
StringBuilder sb = new StringBuilder();
if(this.mm < 10) sb.append("0").append(this.mm);
else sb.append(this.mm);
sb.append(":");
if(this.ss < 10) sb.append("0").append(this.ss);
else sb.append(this.ss);
return sb.toString();
}
}
(2) ๋ถ์ ์ด๋ก ๋ณํ ํ์ด
import java.io.*;
import java.util.*;
class Solution {
private final String DELIM = ":";
private final String PREV = "prev";
private final String NEXT = "next";
static private int now;
static private int end;
static private int open_s;
static private int open_e;
public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
now = convert2Sec(pos);
end = convert2Sec(video_len);
open_s = convert2Sec(op_start);
open_e = convert2Sec(op_end);
skip();
for(String order : commands){
if(order.equals(PREV)) prev();
else next();
skip();
}
return convert2String(now);
}
public int convert2Sec (String mmss) {
StringTokenizer st = new StringTokenizer(mmss, DELIM);
return Integer.parseInt(st.nextToken())*60 + Integer.parseInt(st.nextToken());
}
public String convert2String (int time) {
StringBuilder sb = new StringBuilder();
int mm = time/60;
int ss = time%60;
if(mm < 10) sb.append("0");
sb.append(mm).append(":");
if(ss < 10) sb.append("0");
sb.append(ss);
return sb.toString();
}
public void skip() {
if(now < open_s || now > open_e) return;
else now = open_e;
}
public void next() {
now += 10;
if(now > end) now = end;
}
public void prev() {
now -= 10;
if(now < 0) now = 0;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
์ด๋ฌํ ์๊ฐ ๋ฌธ์ ๋ค์ ํญ์ Class
ํ ์์ผ์ ํ๊ณค ํ๋๋ฐ, ํน์ ๋จ์๋ก ๋ชจ๋ ๋ณํ ํ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ด ๋ ์ฝ๊ฒ ํ ์ ์์์ ๊นจ๋ฌ์๋ค.