ilovemyreport   1년 전

원하는 값은 다 충족한다고 하는데 어디서 막히는지,,

도와주시면 감사하겠습니다ㅠㅠ

starlight747   1년 전

반례입니다.
23 59

120

ilovemyreport   1년 전

이건 어떤 조건을 달아주면 될까요?

starlight747   1년 전

이러한 반례는 또 있습니다.
23 0
120

if문으로 조건들을 쪼개 주실 때 if, else if, else if, else로 나누었는데 이 안에 있는 값들이 입력제한조건에 부합하는 모든 입력값에 대해 확실하게 계산해준다는 검증을 먼저 해봐야할 것 같습니다.
이를 알아보기 위해서 일단은 if문안의 조건을 한글로 풀어서 설명(주석)을 달아보면 좋을 것 같네요. 그러기위해 전에 코드를 먼저 정리 해보겠습니다.
그리고 취소선으로 표시한 if문 다음의 else if 문에 println에 A+(i/60) 부분은 결국 d와 같으므로 좀 더 깔끔하게 d로 바꾸어 주겠습니다.
그리고 i-((i/60)*60)은 i에서 i를 60으로 나눈 몫에 60을 곱한 것이므로 결국 i를 60으로 나눈 나머지를 의미하므로 마찬가지로 좀 더 깔끔하게 i%60으로 바꾸어 주겠습니다.

이를테면 아래와 같이 주석을 달 수 있겠습니다.

// 0분이면서 24시가 아닐때
if(i%60==0 && d!==24) {
println("\${d} \${i%60}")
// 현재 시간 분과 추가시간 분을 합쳐서 60분을 넘기면서 24시가 아닐때
} else if(i>60 && d!==24) {
println("\${A+(i/60) => d} \${i-((i/60)*60) => i%60}")
// 추가시간 분을 합친 후 시간이 24시 일때
} else if(d==24) {
println("\${d-24} \${i-60}")}
// 나머지 경우.
else{
println("\${A} \${i}")
}

그리고 나서 두 번째 else if 까지만 보면 결국 i값에 관계없이 똑같이 d(시) i%60(분)을 출력하고 있네요. 1 <= i <= 59분까지의 조건에서도 출력이 d(시) i%60(분)이라면 조건에서 i에 대한 조건을 빼도 될 것 같습니다. 그렇게 된다면 d!==24 일 때 모든 i에 관해서 동일 출력이 되므로 if문과 else if문을 하나의 if문으로 합쳐볼 수 있습니다. 만약 i값이 1분 이상 59분 이하라고 가정을 해봅시다. 그러면 세 개의 if문의 조건에 해당하지 않기 때문에 else 문으로 갈 겁니다. 근데 else문의 출력이 A시 i분이므로 결국 i값에 관계없이 d시 I%60분을 출력하면 됩니다. 왜냐하면 i 값이 1~59분이면 d값은 A + (i/60)인데 뒤에 나오는 (i/60)이 0이되어 A가 되고 i%60도 그대로 i값이니까요. 따라서 이 코드는 i값에 관계없이 d(시) i%60(분)을 출력하고 있다고 말할 수 있겠습니다.

// 0분이면서 24시가 아닐때
if(i%60==0 && d!==24) {
println("\${d} \${i%60}")
// 현재 시간 분과 추가시간 분을 합쳐서 60분을 넘기면서 24시가 아닐때
} else if(i>60 && d!==24) {
println("\${d} \${i%60}")
} else if(d==24) {
println("\${d-24} \${i-60}")}
// 나머지 경우.
else{
println("\${A} \${i}")
}

따라서 d!==24일때 모든 i에 대해 d(시) i%60(분)을 출력할 수 있으므로 아래에 i에 대한 조건을 제거해 보았습니다. d!==24가 똑같습니다. 물론 if문 한 번으로 바꿀 수 있겠습니다.

// 추가시간 분을 합친 후 시간이 24시 일때

if(d!==24) {
println("\${d} \${i%60}")
// 현재 시간 분과 추가시간 분을 합쳐서 60분을 넘기면서 24시가 아닐때
} else if(d!==24) {
println("\${d} \${i%60}")
} else{
println("\${A} \${i}")
}


그리고 나서 보겠습니다. 여기까지 하면 질문자님이 작성하신 것과 같은 기능을 하는 코드의 조건부분을 깔끔하게 정리 해 보았습니다.

// 추가시간 분을 합친 후 시간이 24시가 아닐때
if(d!==24) {
println("\${d} \${i%60}")

// 추가시간 분을 합친 후 시간이 24시일 때
} else if(d==24) {
println("\${d-24} \${i-60}")}
// 나머지 경우.
else{
println("\${A} ${i}")
}

이제 이 코드의 조건들로 모든 상황을 다 커버할 수 있는지 체크 하시면 될 것 같습니다.
위 코드에서는 d가 24보다 클 때는 어디서 처리가 되는지 확인해보면 24가 아니므로 처음 if 구문에서 처리가 되겠습니다.
따라서 25보다 클 경우에는 역시나 제대로된 출력이 나오지 않고 있네요.

그러면 우선 제대로된 출력이 나올 수 있도록 d !==24를 d < 24로 고쳐보겠습니다.

// 추가시간 분을 합친 후 시간이 24시보다 작을 때
if(d < 24) {
println("\${d} \${i%60}")
// 추가시간 분을 합친 후 시간이 24시 일때
} else if(d==24) {
println("\${d-24} \${i-60}")}
// 나머지 경우.
else{
println("\${A} \${i}")
}
이제 첫 번째 조건인(if) d가 24보다 작을 때는 올바른 출력이 나올거라는 생각이 듭니다.
다음 조건인(else if) d가 24일때도 올바른 출력이 나올거라는 생각이 듭니다.
마지막 조건인(else) d가 24보다 클 때를 한 번 보면 시간부분에 추가시간이 반영되지 않고 A가 출력되겠습니다. 그러면 이를 해결하기 위해서 d를 24로 빼거나 24로 나눈 나머지를 출력 시간으로 정하면 되겠습니다. 그리고 i는 i를 60으로 나눈 나머지로 출력하면 되겠습니다. 그러면 아래 코드와 같이 되겠네요.

// 추가시간 분을 합친 후 시간이 24시보다 작을 때
if(d < 24) {
println("\${d} \${i%60}")
// 추가시간 분을 합친 후 시간이 24시 일때
} else if(d==24) {
println("\${d-24} \${i-60}")}
// 나머지 경우.
else{
println("\${d-24} \${i%60}")
}

여기서 d==24부분의 i-60도 i%60으로 처리할 수 있겠네요.
// 추가시간 분을 합친 후 시간이 24시보다 작을 때
if(d < 24) {
println("\${d} {i%60}")
// 추가시간 분을 합친 후 시간이 24시 일때
} else if(d==24) {
println("\${d-24} \${i%60}")}
// 나머지 경우.
else{
println("\${d-24} \${i%60}")
}

그러면 else if 부분을 else로 합친 후 삭제 시켜도 되겠군요.

// 추가시간 분을 합친 후 시간이 24시 보다 작을 때

if(d < 24) {
println("\${d} \${i%60}")
}
// 나머지 경우.
else{
println("\${d-24} \${i%60}")
}

최종적으로 이렇게 코드가 나왔네요.
너무 읽기 힘들게 장황하게 설명해서 죄송합니다. 제 한계인 것 같네요. 제가 쓰면서도 사실 조금 힘이드네요. 쓰는 제가 힘들 정도인데 읽으시는 분은 얼마나 힘드실까 너무 길게 쓴 게 아닌가 염려가 됩니다. 하지만 최대한으로 자세하게 설명해 보았으니 앞으로 코딩하실 때 유익한 도움이 되셨으면 좋겠습니다. 저도 처음할 때 이렇게 복잡하게 if else문 쓴 적 있습니다. 누구나 이런 시절을 겪고 점차 좋은 프로그래머로 성장할 거라 생각합니다.

추가적으로 d를 24로 나눈 나머지를 구한다는 생각은 현재 입력값 C에 해당하는 값의 최대가 1000분이라서 24시간(1440분)을 넘지 않기에 24를 빼주기만하면 됩니다. 하지만 1440을 넘어갔을 때는 48보다 커질 수 있습니다. 이때는 48을 빼줘야할 것입니다. (예시 입력 23 59 1441/ 예시 출력 48 0)
따라서 좀 더 큰 입력값에 대해서도 확장성있을 거 같아서 이런 생각도 한 번 해보시면 좋을거 같아서 생각해봤습니다.

그럼 코드가 아래처럼 될 것 같네요.

// 추가시간 분을 합친 후 시간이 24시 보다 작을 때

if(d < 24) {
println("\${d} \${i%60}")
}
// 나머지 경우.
else{
println("\${d%24} \${i%60}")
}

starlight747   1년 전

따라서 d!==24일때 모든 i에 대해 d(시) i%60(분)을 출력할 수 있으므로 아래에 i에 대한 조건을 제거해 보았습니다. d!==24가 똑같습니다. 물론 if문 한 번으로 바꿀 수 있겠습니다.

// 추가시간 분을 합친 후 시간이 24시 일때

여기 부분 주석 오타났네요.
// 추가시간 분을 합친 후 시간이 24시가 아닐때

starlight747   1년 전

그리고 i-((i/60)*60)은 i에서 i를 60으로 나눈 몫에 60을 곱한 것이므로 결국 i를 60으로 나눈 나머지를 의미하므로 마찬가지로 좀 더 깔끔하게 i%60으로 바꾸어 주겠습니다.
=> 그리고 i-((i/60)*60)은 i에서 i를 60으로 나눈 몫에 60을 곱한 것을 뺀 것 이므로 결국 i를 60으로 나눈 나머지를 의미하므로 마찬가지로 좀 더 깔끔하게 i%60으로 바꾸어 주겠습니다.
급하게 써서 그런가 오타가 많네요. 죄송합니다.

저는 이런 문제를 보면 보통 시간에다가 60을 곱해서 분으로 만든 뒤 모든 분에 해당하는 값들을 다 더한 후 그 값을 60으로 나눠서 몫을 시간으로 하고 나머지를 분으로 하는 방식으로 보통 풀고 있습니다.
var minutes = a*60+b+c;
var hour = minutes/60;
var minute = minutes%60;

if(d < 24){
println("\${hour} \${minute}");
} else {

println("\${hour%60} \${minute}");

}

얘는 결국 minute이 minutes%60 이므로

if(d < 24){
println("\${hour} \${minutes%60}");
} else {

println("\${hour%60} \${minutes%60}");

}


대충 코드로 써보면 이렇게 될텐데 질문자님 코드를 정리해서 바꾸니까 if문 안에 조건들이 같고 출력 내용도 시간 부분만 약간 변형됐을 뿐 제가 풀었던 코드와 매우 유사하게 나오는 것 또한 확인을 하였습니다.
혹시라도 참고하시라고 같이 올려봅니다.

ilovemyreport   1년 전

우와!!! 제가 출장다녀와서 답변이 너무 늦었네요ㅠㅠ

친절하게 말씀주셔서 너무너무 감사합니다

계속해서 보고 수정할 수 있도록 할게요

친절하게 말씀주셔서 진심으로 다시 감사드려요!!!

행복한 목요일 보내세요!

starlight747   1년 전

아 마지막 답변에 코드들 else 쪽에 두 개다 hour%60이 아니라 hour%24입니다. 오타났네요.

ilovemyreport   1년 전

안녕하세요 혹시 실례가 되지 않는다면 질문 하나만 더 해도 괜찮을까요?

starlight747   1년 전

네 괜찮습니다.

댓글을 작성하려면 로그인해야 합니다.