๐ 1. ๋ฌธ์ ์ค๋ช
๐ก 2. ์ ๊ทผ๋ฐฉ์
๋ง๋ค์ด์ค ๋ฉ์๋๋ 4๊ฐ์ง
- ์คํ๋ ๋ ์์น๋ก ์ด๋ํ๋ `SkipOp()` ๋ฉ์๋
- ๋ช ๋ น์ด "next" ์ด๋ฉด 10์ด ๋ค๋ก ์ด๋ํ๋ `moveToNext()`๋ฉ์๋
- ๋ช ๋ น์ด "prev" ์ด๋ฉด 10์ด ์์ผ๋ก ์ด๋ํ๋ `moveToPrev()` ๋ฉ์๋
- String ํ์ ์ผ๋ก ์ ๋ ฅ ๋ฐ์ ์๊ฐ์ LocalTime์ผ๋ก ํ๋ณํ ํ๋ `getTime()`๋ฉ์๋
"mm:ss" ํ์์ผ๋ก ๋ฐ์์จ ์๊ฐ์ ":" ๊ธฐ์ค์ผ๋ก ๋ถ, ์ด ๋จ์๋ก ๋๋์ด ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
LocalTime์ด ๊ฐ์ง ๋ฉ์๋๋ก ์๊ฐ ๊ณ์ฐ์ ํ๊ณ , ๋ฐํํ ๋๋ ๋ค์ "mm:ss" ํ์์ผ๋ก ํฌ๋งคํ ํด์ ๋ฐํํด ์ฃผ์ด์ผ ํจ.
ํ์ฌ ์๊ฐ์ด ์คํ๋ ์์น ์์ ์์ ๋๋ ์๋์ผ๋ก SkipOp() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
โญ 3. ์ ๋ต์ฝ๋
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
class Solution {
private LocalTime videoTime;
private LocalTime posTime;
private LocalTime opStartTime;
private LocalTime opEndTime;
public String solution(String video_len, String pos, String op_start,
String op_end, String[] commands) {
// ์๊ฐ ๋ฌธ์์ด ๋ถ๋ฆฌ
String videoSplit[] = video_len.split(":");
String posSplit[] = pos.split(":");
String opStart[] = op_start.split(":");
String opEnd[] = op_end.split(":");
// LocalTime์ผ๋ก ๋ณํ
videoTime = getTime(videoSplit); // ์ ์ฒด ๋์์ ์๊ฐ
posTime = getTime(posSplit); // ํ์ฌ ์ฌ์ ์์น
opStartTime = getTime(opStart); // ์คํ๋ ์์ ์์น
opEndTime = getTime(opEnd); // ์คํ๋ ๋ ์์น
// ์ฒ์ ์ฌ์ ์ ์คํ๋ ์คํต
skipOp();
// ๋ช
๋ น์ด ์ฒ๋ฆฌ
for (String command : commands) {
if (command.equals("prev")) {
moveToPrev();
} else if (command.equals("next")) {
moveToNext();
}
skipOp();
}
// ํ์ฌ ์ฌ์ ์๊ฐ์ "mm:ss" ํ์์ผ๋ก ๋ฐํ(ํจ๋ฉ์ฒ๋ฆฌ)
return posTime.format(DateTimeFormatter.ofPattern("mm:ss"));
}
// 10์ด ๋ค๋ก ์ด๋ํ๋ ๋ฉ์๋
private void moveToNext() {
posTime = posTime.plusSeconds(10);
if (posTime.isAfter(videoTime)) {
posTime = videoTime; // ๋์์ ๋ ์๊ฐ์ ์ด๊ณผํ์ง ์๋๋ก ์ค์
}
}
// 10์ด ์์ผ๋ก ์ด๋ํ๋ ๋ฉ์๋
private void moveToPrev() {
int minute = posTime.getMinute();
int second = posTime.getSecond();
if (minute == 0 && second < 10) {
posTime = LocalTime.of(0, 0, 0); // 0์ด ๋ฏธ๋ง์ผ๋ก ์ด๋ํ๋ฉด 00:00์ผ๋ก ์ค์
return;
}
posTime = posTime.minusSeconds(10);
}
// ์คํ๋ ์คํต ๋ฉ์๋
private void skipOp() {
if (!posTime.isBefore(opStartTime) && !posTime.isAfter(opEndTime)) {
posTime = opEndTime; // ์คํ๋ ์๊ฐ ๋ด์ ์์ผ๋ฉด ์คํ๋ ๋์ผ๋ก ์ด๋
}
}
// ๋ฌธ์์ด๋ก ํํ๋ ์๊ฐ์ LocalTime ํ์
์ผ๋ก ๋ณํํ๋ ๋ฉ์๋
private LocalTime getTime(String[] split) {
int min = Integer.parseInt(split[0]);
int sec = Integer.parseInt(split[1]);
return LocalTime.of(0, min, sec);
}
}
+ ํ ์คํธ ์ฝ๋
public static void main(String[] args) {
Solution sol = new Solution();
// ํ
์คํธ ์
๋ ฅ
String videoLen = "10:00"; // ๋์์ ๊ธธ์ด
String pos = "00:05"; // ์ด๊ธฐ ์ฌ์ ์์น
String opStart = "00:10"; // ์คํ๋ ์์ ์๊ฐ
String opEnd = "00:20"; // ์คํ๋ ๋ ์๊ฐ
String[] commands = {"next", "next", "prev", "next"}; // ๋ช
๋ น์ด ๋ฐฐ์ด
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
System.out.println(sol.solution(videoLen, pos, opStart, opEnd, commands));
// ์์ ์ถ๋ ฅ: "00:30"
}
์ฌ๋ฌ๋ฒ ํ๋ฆฐ ๋์ ๋๋์ด...!
์ํ์ฐฉ์ค๊ฐ ๋ง์์ ์ฝ๋๋ฅผ ํ 10๋ฒ์ ๊ณ ์น ๊ฒ ๊ฐ๋ค.
์ฒ์ ์ฌ์ ์ ์คํ๋ ์คํต skipOp(); ์ด๊ฑด ์ ํ๋?
์ฒ์ ์ฌ์ ์ skipOp()๋ฅผ ํธ์ถํ๋ ์ด์ ๋ ์ฌ์ ์์น๊ฐ ์ฒ์๋ถํฐ ์คํ๋ ๋ฒ์ ์์ ์์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ ์ด๊ธฐ pos๊ฐ ์คํ๋ ๋ฒ์(op_start ~ op_end)์ ํฌํจ๋๋ค๋ฉด, ์ฌ์ฉ์๊ฐ ์๋ฌด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ง ์๋๋ผ๋ ์ฌ์ ์์น๋ฅผ ์คํ๋ ๋์ผ๋ก ์ด๋์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ผ๋จ skipOp() ํธ์ถ ํด ์ฃผ์ด์ผ ํ๋ค.
ํจ๋ฉ์ ์ฒ๋ฆฌํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ
DateTimeFormatter.ofPattern("mm:ss")์ ์ฌ์ฉํด์ผ ํ๋ค.๊ทธ๋์ผ๋ง ํญ์ ๋ ์๋ฆฟ์์ "mm:ss" ํ์์ด ์ ์ง๋๋ค.
DateTimeFormatter๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ทธ๋ฅ ์ซ์ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ฐ๋ฉด ์๋์ฒ๋ผ ๋๋ค.
public String formatTime(LocalTime time) {
int minutes = time.getMinute();
int seconds = time.getSecond();
return minutes + ":" + seconds; // ์๋ชป๋ ํจ๋ฉ ์ฒ๋ฆฌ
}
์์ ๊ฒฐ๊ณผ
00:05 → 5:3
00:30 → 30:0
์ง์ ๋ฌธ์์ด๋ก ๋ณํํด๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ฐ ํํ๊ฐ ์ผ์ ํ์ง ์์...
import java.time.LocalTime;
public class Solution {
public static void main(String[] args) {
LocalTime time1 = LocalTime.of(0, 5, 3); // 5๋ถ 3์ด
LocalTime time2 = LocalTime.of(0, 15, 30); // 15๋ถ 30์ด
// ํจ๋ฉ ์์ด ์ถ๋ ฅ
System.out.println("time1: " + time1.toString()); // ๊ธฐ๋ณธ toString() ์ฌ์ฉ
System.out.println("time2: " + time2.toString());
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ
time1: 00:05:03
time2: 00:15:30
Java LocalTime ํด๋์ค ๋ฉ์๋ ์ ๋ฆฌ
LocalTime.of(์๊ฐ, ๋ถ, ์ด)
24์๊ฐ์ ๋ก ํน์ ์๊ฐ์ ์์ฑํ๋ ํฉํ ๋ฆฌ ๋ฉ์๋. (์๊ฐ, ๋ถ, ์ด๋ฅผ ์ง์ )
์ด๋ ์๋ต ๊ฐ๋ฅ
LocalTime time1 = LocalTime.of(14, 30); // ์คํ 2์ 30๋ถ
LocalTime time2 = LocalTime.of(14, 30, 45); // ์คํ 2์ 30๋ถ 45์ด
System.out.println(time1); // 14:30
System.out.println(time2); // 14:30:45
isBefore / isAfter
ํ์ฌ LocalTime ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ์๊ฐ๋ณด๋ค ์ด์ ์ธ์ง / ์ดํ์ธ์ง ํ์ธ.
boolean isBefore(LocalTime otherTime);
boolean isAfter(LocalTime otherTime);
LocalTime time1 = LocalTime.of(10, 30);
LocalTime time2 = LocalTime.of(12, 45);
System.out.println(time1.isBefore(time2)); // true
System.out.println(time2.isBefore(time1)); // false
ateTimeFormatter.ofPattern
LocalTime ๊ฐ์ฒด๋ฅผ ํน์ ํ์์ ๋ฌธ์์ด๋ก ๋ณํ
ํฌ๋งท ํ์์ ์๋ฅผ ๋ค๋ฉด "HH:mm", "mm:ss", "HH:mm:ss" ๋ฑ์ด ์์.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(String pattern);
LocalTime time = LocalTime.of(9, 5, 30);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(time.format(formatter)); // 09:05:30
plusSeconds / minusSecond
ํ์ฌ LocalTime ๊ฐ์ฒด์์ ์ง์ ํ ์ด๋งํผ ๋ํ๊ฑฐ๋ ๋บ ์๋ก์ด ์๊ฐ ๋ฐํ.
๊ฐ์ฒด๋ ๋ถ๋ณ(immutable)ํ๋ฏ๋ก ์๋ ๊ฐ์ฒด๋ ๋ณํ์ง ์๊ณ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ.
์ด ๋จ์๋ก ๋ํจ. (๋ถ/์๋ก ๋์ด๊ฐ๋ฉด ์๋์ผ๋ก ๊ณ์ฐ)
๐๐ป ์ข์์ ๊ฐ์ฅ ๋ง์ด ๋ฐ์ ์ฝ๋
class Solution {
public int convertToSeconds(String time) {
String[] split = time.split(":");
return Integer.parseInt(split[0]) * 60 + Integer.parseInt(split[1]);
}
public String solution(String video_len, String pos, String op_start,
String op_end, String[] commands) {
// ๊ฐ ์๊ฐ๋ค ์ด๋ก ๋ณํ
int videoLenSec = convertToSeconds(video_len),
posSec = convertToSeconds(pos),
opStartSec = convertToSeconds(op_start),
opEndSec = convertToSeconds(op_end);
if (posSec >= opStartSec && posSec <= opEndSec) posSec = opEndSec;
// ์์ ๊ฐ ์คํ๋ ๊ตฌ๊ฐ ํ์ธ
for (String command : commands) {
if (command.equals("next")) posSec
= posSec + 10 >= videoLenSec ? videoLenSec : posSec + 10;
else posSec = posSec - 10 > 0 ? posSec - 10 : 0;
if (posSec >= opStartSec && posSec <= opEndSec) posSec = opEndSec;
// ์คํ๋ ๊ตฌ๊ฐ ํ์ธ
}
int m = posSec / 60,
s = posSec % 60;
String answer = ""; // StringBuilder ์ธ์ ๋ ์๋
answer += m < 10 ? "0" + m : m + "";
answer += ":";
answer += s < 10 ? "0" + s : s + "";
return answer;
}
}
๐ฆ 4. ์ค๋ต์ ๋ฆฌ
๋ด๊ฐ ํ๋ฆฐ ๋ถ๋ถ๋ค
1. String opEnd[] = op_end.split(":"); ์ฌ๊ธฐ์ ๋ถํ์ํ ๊ณต๋ฐฑ ์ถ๊ฐํ๊ฑฐ `" : "` → `":"` ๋ก ์์
2. ๋ฉ์๋ ์คํ ์์ `skipOP()` → `skipOp()`๋ก ๋ณ๊ฒฝ.
3. moveToPrev ๊ณ์ฐ ์ค๋ฅ ์์ ํด ์ค. posTime.minusSeconds(10);์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ํ ๋นํ์ง ์์. posTime ๋ณ์์ ํ ๋น ํด ์ค.
4. ์ฒ์์ ๋ฉ์๋๋ ๋ณ์ ์์ static ํค์๋๋ฅผ ๋จ๋ฐ ํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ static์ ์ ๊ฑฐํด ์ฃผ์๋ค. ์์งํ ์์ง๋ ๋ช ์พํ๊ฒ๋ ๋ชจ๋ฅด๊ฒ ๋ค. ์ธ์ static ์ฐ๊ณ ์ธ์ ์ ์ฐ๋์ง, static์ด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ธ๊ฑฐ๋ ์๋๋ฐ,,,
5. DateTimeFormatter.ofPattern("mm:ss") ์์ ์คํ ์์ `Fomatter` → `Formatter`
6. LocalTime ์์ฑ์ ์๋ชป ์ฌ์ฉ`LocalTime(0, 0, 0)` → `LocalTime.of(0, 0, 0)`
7. ์ ์๋์ง ์์ ๋ณ์๋ช ์ธ `min` ์ฌ์ฉ. moveToPrev() ๋ฉ์๋์์ min์ด๋ผ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ค์ ๋ก ๋ด๊ฐ ์ ์ธํ ๋ณ์ ์ด๋ฆ์ minute์๋ค. ํ์์ ๋ถ์ min์ด๋ผ๊ณ ์ ์ธํ๋ค ๋ณด๋ if ์กฐ๊ฑด๋ฌธ์์ `min == 0`์ด๋ผ๊ณ ์๋ชป ์ฌ์ฉํ๋ค. ํด๋น ๋ถ๋ถ์ `minute == 0`๋ก ์์ ํด ์ฃผ์๋ค.
8. Solution ํด๋์ค ๋ฐ๊นฅ์ main ์์ญ ๋ง๋ค์ด์ ์ฝ๋ ํ ์คํธ ๋๋ ค๋ณด์์ผ๋ ํ๋๋ฐ ํ๋ก๊ทธ๋๋จธ์ค ์์ฒด ์์๋ ์ ๋จ
๋ฉ์๋๋ง ์ ์ฐพ์์ ์ฐ๋ฉด ์ด๋ ค์ธ ๊ฑด ์์ง๋ง, ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ ํ๋ค์๋ค.