자바수업 기록

학원 첫주 나의 최고의 난제 .. 백준 조건문 문제풀기 중 알람시계 문제 해결과정.

JadeStone 2022. 9. 26. 00:27

https://www.acmicpc.net/problem/2884 

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net

 

자바 수업 첫주.
조건문을 배우고 백준에서 단계별 문제풀기에서 조건문 문제를 푸는과정 중 난제를 만났다.

처음에 문제를 보고서는 어떻게 풀어나가야할지 감도 오지 않았으며.

달리는 자동차를 보고 얼어버린 고라니마냥 나는 그대로 얼어버리고 말았다.

목요일 수업시간에  선생님께서 시간에 곱하기 60을 해주어 분단위로 치환해 주어서 문제를 풀어나가보라고 힌트를 주신것을 갖고 조금씩 조금씩 풀이를 해나갔다.

 

# 내 첫 풀이.(실패)

Scanner scan = new Scanner(System.in);
System.out.print("시간:");
int h = scan.nextInt(); // h*60
System.out.print("분:"); // m
int m = scan.nextInt();
int chang = h*60 + m - 45;
int fh = chang/60;
int fm = chang%60;

// h*60 + m -45 = chang 
//  chang/60 = fh
//  chang%60 = fm  ( 이 때 정수이기 때문에 소수부는 날아간다.)
// h <= 23

if(h<=23 && m<=59) {
System.out.println( fh + " " + fm );

 

처음에 이정도로 풀어놓고 결과가 잘 나오는 부분이 있어서 백준에 의기양양하게 내 풀이를 제출했는데 
채점 결과는 틀렸음.  충격이었다. 잘 풀었다는 생각에 사로잡혀  출력이 안 되는 케이스가 있다는 것을 생각하지 못 하고 있었다. 

이 상황에서 오답풀이를 어떻게 해나가야할지 모르겠어서. 선생님께 이럴 때 어떻게 하면 좋은지 여쭤봤더니.

이 문제에서 질문 검색 란을 들어가서 다른 사람들이 자신들의 풀이를 올려놓고 무엇이 문제인지 답을 받는 장소라는 것을 소개 받고 그곳을 참고하여 오답 풀이를 하면 된다는 것을 알게되었다. 그와동시에 

시간과 분에 각각 0과 0을 대입하면 현재 내 풀이에서는 값이 출력이 안된다는  사실을 알았다.

그렇게 다시 풀이과정 시작. 

(아 그리고 중간에 생각을 주석으로 적어서 미리 문장을 어떻게 짜면 좋을지 기록을 해두니 코딩과정이 굉장히 편안하고 풀이 과정을 체크하기 좋았다. 주석을 잘 활용하도록 해야겠다.)

 

생각해보고 문장을 만들고 콘솔로 실행해보고 문제를 발견하고. 

이렇게 시행착오를 정말 많이 겪으면서 알게된 내 문제점.

조건문 사용시 내가 걸어둔 조건의 범위가 겹치는 구간이 있었다. 그래서

원래는 한 if 문에서 다음 else if 조건으로 넘어가서 그쪽에 실행문이 출력 되어야하는데 그러지 못하고 계속 

윗단계의 조건의 실행문이 실행 되고있는 문제점이 있었다.

다음부턴 조건을 설정할 시에 조건의 범위가 정해졌다면 그 다음 조건을 설정할 때는 조건의 범위가 겹치는 구간이 있는지 잘 확인하면서 문장을 만들어야겠다고 생각이 들었다. 아무튼 이걸 놓치고 있는 줄 모르고 뻘짓을 여러번 했다..

그걸 깨닫고 문장을 고쳐서 답을 제출 했더니 드디어 합격.

 

#내 2차 풀이 (합격)

Scanner scan = new Scanner(System.in);
//System.out.print("시간:");
int h = scan.nextInt(); // h*60
//System.out.print("분:"); // m
int m = scan.nextInt();
int chang = h*60 + m - 45;
int fh = chang/60; // 바뀐 시
int fm = chang%60; // 바뀐 분 

  
if(h != 0 && m != 0) {
System.out.println( fh + " " + fm );
} else if(h==0 && m >= 45) {
System.out.println( 0 + " " + fm );
} else if(h==0 && m <= 44 && m > 0) {
System.out.println( 23 + " " + (60-fm*-1) );
} else if(h==0 && m == 0){
System.out.println( 23 + " " + 15 );

 

그런데 합격은 받았지만. 이렇게 답을 내놓고 보니 출력값은 제대로 나오지만

이 문장들이 결코 좋은 내용이 아니라고 생각이 들었다.

전에 생활코딩 강의를 들으면서 명심해두었던 것은. 코딩 내용은 중복을 제거하고.

특히 유지,보수 즉 관리가 수월하도록 짜야한다는 것이 생각났기 때문이다.

이 때 ai 쪽에서 일하고 있는 친구가 내게 하나 알려주었다.

코딩문 단 한줄.

그리고 난 충격을 받고 온몸에 전율이 일었다. 

문제를 해결하고 지금 이 기록을 쓰고 있는 와중에도 깨달은 충격으로 인한 떨림이 계속 멈추지 않는다..

 

# 친구가 알려준 코딩 한줄.

if(chang <0) chang += (60 * 24);

친구가 이 문장을 하나 추가하고 

밑에 길게 써놓았던 조건문을 싹다 지우고 sysout 해보라고 알려줬다.

그결과.

 //System.out.print("시간:");
      int h = scan.nextInt(); // h*60
      //System.out.print("분:"); // m
      int m = scan.nextInt();
      int chang = h*60 + m - 45;
      if(chang <0) chang += (60 * 24);
      int fh = chang/60; // 바뀐 시
      int fm = chang%60; // 바뀐 분 
        
       System.out.println( fh + " " + fm );

위에 그 길었던 문장이 정말 너무나 허무하게도 이렇게 끝나버렸다.

그리고 이 내용으로는 알람시계의 설정을 내가 원하는데로 너무나 쉽게 바꿀 수 있다는 것을 알고

또 충격을 받았다. 

좋은 문장과 나쁜 문장의 차이를 정말 크게 체감한  순간이었다.

 

if(chang <0) chang += (60 * 24); 
친구가 알려준 이 한줄의 코딩.

여기서 내가 몰랐던 것은.

if문을 이렇게도 사용할 수 있다는것.

앞으로 변수를 더 다양하게 활용할 수 있게되었다. 잘 기억해두고 요긴하게 써먹도록 하자.

 

# 학원 첫주 ( 2022,09,20 화요일부터 시작.)

이 알람시계 문제를 풀고 기록하면서 동시에  화요일부터의 첫주의 주말까지 끝나게 되었다.

현재시간 새벽 00시 16분. 

개발자가 되기위한 이 6개월 과정 힘들거라고 하도 많이 들어서.

두려움과 걱정을 안고 학원 첫 수업을 듣기 시작하여 

새로운 것을 배우고 문제들도 풀어보면서 생각보다 내용이 재미있어서 즐겁게 첫 주를 보냈다. 
현재 while 문까지 배웠고 내일부터 자바에서 그 유명한 별찍기를 배울거 같다.

두렵고 또 한편으론 기대되기도 하는거 같다.

나는 코딩이 어려워도 이제 내 인생에 돌아갈 길은 없다. 내가 먹고 살려면 반드시 이 과정을 잘 수료하고 취업을 하고 
꾸준히 자기개발하여 성장해야만 한다. 각오를 다지고 이 길에 들어왔으니 두렵지만 용기를 내서 열심히 해보자! 

그래도 친한 친구들 중에 개발자로 있는 친구들이 있어서 참 든든한거 같다.

도와주는 친구들이 내 옆에 있어줘서 참 감사하다.

아침에 또 6시에 일어나서 준비해서 늦어도 7시 5분에는 집에서 출발해야한다.

이만 어서 자야겠다.