셔틀버스

유승선 ·2022년 3월 12일
0

프로그래머스

목록 보기
17/48

정말 오랜만에 블로그를 사용해보는 날이다. 한참 코딩 문제를 업로드 할때만 해도 군대에 있었는데 지금은 운 좋게 휴가를 나와있어서 집 컴퓨터로 편하게 코딩문제를 올리는중인데 굉장히 마음 편하고 기분이 좋다. 역시 기계식 키보드랑 큰 화면은 사기이다.

아무리 좋은 장비를 가졌다하더라도 내 코딩실력의 변화는 역시 문제를 많이 풀고 생각하는 시간을 많이 가져야하는건데 그 점에서 내 공부법이 조금씩 부족하다는 생각을 많이 하고있다. 조금씩 열심히 해야한다는 마음이 많이 들고있다.

이번 문제는 셔틀버스라는 2018년 카카오 블라인드 레벨3 문제이다. 예전부터 이 문제를 관망 했지만 어떻게 풀어야하는지를 몰랐어서 계속 해매다가 이번에야 풀어봤다. 여전히 이 문제를 읽고도 어떤 방법을 써야할지, 구현 문제이지만 어떻게 보면 문제에서 나오는 창의력과 해결 방법을 요구하는 문제같았다.

해결 방법은 크게 2가지가 있었다.

  1. 콘은 가장 마지막 줄, 그리고 가장 마지막 셔틀을 타야하기 때문에 n의 숫자와 같아질때까지 셔틀을 t만큼의 시간만큼 보내야한다.

  2. timetable 안에있는 크루들이 정상적으로 m만큼의 수가 탑승을 하게된다면 콘은 가장 마지막 줄에 대기해야하기때문에 m-1 에 탑승하는 사람보다 1분 더 빠르거나 같은 시간에 타야한다.
    ㄴ 조금더 구체적으로 설명하자면은 셔틀버스는 항상 09시에 출발한다. 그래서 09시 이전에 탔던 사람들을 전부 태우지만 만약에 콘이 n대의 셔틀버스가 왔을때까지 탑승이 불가능 하다면 가장 마지막에 탑승하는 사람보다 1분 더 일찍 오면은 조건이 완성될수있다.

당장 해결방법을 적었지만 헷갈리는건 여전한 사실이고. 나는 처음에 이거를 타임 테이블 vector 로 00시00분 부터 23시59분까지 만들고 timetable 에 나와있는 사람들의 대기 시간만큼 투포인터로 해줘야하나 라는 어리석은 생각을 했던거같다.

위에 말한 해결방법만 잘 따른다면 문제 자체는 정말 쉽다.

첫번째로 timetable 안에서 크루들의 도착시간과 셔틀버스의 시간을 통일시켜줘얗 하기때문에 시간을 분으로 맞추고 time_list라는 새로운 벡터에 저장을 했다. 이제 시간을 분으로 바꾸는류의 문제는 많이 해봤기 때문에 저렇게 간단하게도 그냥 쓸수있는거같다. 오름차순으로 time_list를 정렬해준거는 나중에 셔틀버스의 시간과 비교하기 위해 해주었다.


이 부분이 좀 헷갈릴수도 있는 부분인데, 셔틀버스는 항상 09시에 출발을 하기때문에 shuttle_interval의 시작지점은 540분이다 (09:00) 그리고 n이라는 가장 마지막 셔틀에 콘이 탑승을 해야하기때문에 i를 1로 지정하고 n만큼 계속 늘려줬다, 그리고 loop이 돌아갈때마다 t라는 차가 오는 간격을 현재 셔틀 버스 시간에 추가함으로써 콘이 탈수있는 최적의 시간을 맞춰주었다. tmp_index는 벡터안에 크루원들이 탑승하는 숫자를 확인하기 위해서 임의에 index를 만들어준것이며 매번 셔틀이 지나갈때마다 time_list를 읽어주면서 cnt라는 승객들의 수를 같이 늘려주었다. 만약에 n이 마지막 셔틀버스라면, (i == n) 콘이 무조건 적으로 탔기때문에 계산을 해줘야한다. 만약에 cnt 라는 승객의 수가 정원인 m만큼 타게됐다면 콘은 마지막으로 탔던 승객보다 1분 늦게 와야지 겨우 탑승이 가능하다. 반대로 m이라는 정원 숫자가 남아있다면 콘이 탈수있는 가장 마지막 시간은 현재의 셔틀 시간이다.


이건 그냥 자투리 코딩이긴 한데 분으로 적용된 answer_time 을 답이 원하는 포멧인 "XX:XX" 로 맞춰주기 위해 썼던거다. 분명히 이것보다 간단히 할수있을거같긴한데 일단 이렇게 해줬다. 시간에 /10 을 하면 가장 첫번째 숫자를 얻을수있고 %10 을쓰면 끝에 자리를 얻을수있는 간단한 계산이다.

솔직히 원리만 알면 코딩 짜는건 쉬운데 이런 창의력이 좀 부족하다는 느낌을 많이 받는다. 역시 문제를 많이 풀어야지 늘어가는건가 싶기도 하고 여러모로 자기반성의 시간을 가지고있다. 답을 쓸수있게 설명을 보조해준 https://yabmoons.tistory.com/ 감사하다.

배운점:
1. 문제를 끝까지 읽어보고 어떤것을 요구하는지를 알아야한다.
2. 시간을 이용한 답을 구하는 문제에서는 대부분 시/분/초 등을 이용해서 통일을 시켜줘야할거같다.

profile
성장하는 사람

0개의 댓글