Q. 시, 분, 초를 입력받아 1초를 더한 결과값을 특정 형태의 메시지로 리턴해야 한다.
출력 조건)
A.
일단, 처음에는 0 <= hour < 24, 0 <= minute <= 60, 0 <= second <= 60 이므로 시간, 분, 초에 대한 조건문이 3개 필요하다고 생각했다. 그러나 잘 생각해보면,
시간이 정각인 경우, 분이 60분인 경우, 초가 60초인 경우에는
앞자리가 바뀐다. 그래서 크게 그 경우와
시간이 바뀌지 않는 구간인 경우 (1시~ 23시, 1분~59분, 1초~59초)를 구분하고, 그리고 첫 번째 경우에서 또 정각, 60분, 60초의 경우로 조건을 나누면 된다.
function addOneSecond(hour, minute, second)
second += 1;
if(second === 60){
second = 0;
minute += 1;
}
if(minute === 60){
minute = 0;
hour += 1;
}
if(hour === 24){
hour = 0;
}
if(hour < 24 && minute < 60 && second < 60){
return `1초 뒤에 ${hour}시 ${minute}분 ${second}초 입니다`
}
}
우선 맨 처음 1초 뒤에 시간이 바뀌므로, 현재 초에 1을 더하고 시작한다.
그 다음, 초가 60이 되었는지 평가하고, 초가 60이 되면,
분을 1 증가시키고, 초는 0으로 초기화 한다.
마찬가지로 분도 그렇게 한다.
시간은 24시가 되면 0이 되므로 0으로 초기화 한다.
그런 다음 정각이 아닌 경우의 조건문을 작성한다.
정각이면 위의 조건문에서 실행하고 종료한 후에 return의 문장을 반환하겠지만, 정각이 아니면 다음 조건문으로 넘어와 실행된 후 return의 문장을 반환한다.
나는 매개변수를 사용했지만, 별도로 각각의 매개변수를 새로운 변수에 할당하여 구해도 된다.
let newHour = hour;
let newMinute = minute;
let newSecond = second + 1;
이는 매개변수를 직접 조작하면 함수를 호출한 곳에서 전달한 값을 수정해버리기 때문에, 함수 호출 이후에 예기치 않은 오류가 발생할 수 있다. 따라서, 매개변수를 직접 조작하는 대신 새로운 변수에 값을 저장하고, 이를 반환하는 것이 좋다.
function addOneSecond(hour, minute, second) {
if (hour < 24 && minute < 60 && second < 60) {
// 시간, 분, 초가 유효한 범위 내에 있을 경우
second += 1;
if (second === 60) {
// 초가 60이 되면 1분 추가하고 초는 0으로 초기화
second = 0;
minute += 1;
if (minute === 60) {
// 분이 60이 되면 1시간 추가하고 분은 0으로 초기화
minute = 0;
hour += 1;
if (hour === 24) {
// 시간이 24가 되면 0으로 초기화
hour = 0;
}
}
}
return 1초 뒤에 ${hour}시 ${minute}분 ${second}초 입니다.;
} else {
// 시간, 분, 초가 유효한 범위를 벗어날 경우
return "유효하지 않은 시간입니다.";
}
}
for문을 이용해서도 addOneSecond() 함수를 구현할 수 있다.
하지만 현재 작성된 코드는 for문이 필요하지 않다.
for문은 특정 횟수만큼 반복을 수행할 때 사용되는 반면,
현재 코드에서는 반복 횟수가 정해져 있지 않고 조건에 따라 분기문이 수행된다.
따라서 현재 작성된 코드에서는 for문이 아닌 중첩된 if문을 이용해서
시간, 분, 초를 조작하는 방식으로 구현이 가능하다.