정답 전 코드:
풀이 :
우선 A,B,V를 각각 입력받고,
구하려는 날 days 의 초기값을 0, 현재 달팽이의 위치 Position도 0으로
설정했다.
그 뒤 while 반복문을 통해 days 를 1씩 늘렸는데,
이 때 달팽이의 포지션에 낮에 올라가는 이동거리 A를 더하고,
이 위치가 오르려는 V보다 작을 때 B만큼을 빼주는 과정을 반복하였고,
만약 달팽이의 위치가 V와 같거나 커질 때, 그 즉시 반복문을 빠져나와
days를 출력하게 만들었다.
이 코드도 정답을 얻을 순 있지만, 정답이 아니었다.
우선 이 코드를 사용 시, 큰 숫자가 들어갈 경우 너무 많은 처리과정이 필요하기에
문제에서 요구하는 시간 내에 '절대' 코드가 돌아가지 않았다..
정답 코드:
코드 풀이:
우선 무수히 많은 시행 착오를 겪었다.
결국 문제에서 원하는 건, 컴퓨터에게 복잡한 알고리즘을 주기 전에,
내가 내 능력으로 이 문제를 간소화해서, 최소한의 작업을 시키는 걸 원하는 거다.
이 문제를 푸는 과정에서, 수학 공부를 더 해서
조금 더 성능 좋은 프로그래밍을 하기 위해선 내 능력도 중요하다는 걸 깨달았다.
1 2 3 4 => Day
2 2 2 2 => A
2 3 4 5 => V
-1 -1 -1 => B
1 2 3 => 현재 위치.
내가 만든 표다. A,B,V의 상관 관계를 알기 위해, 예제 코드인
A,B,V = 2,1,5 를 대입해서, Day 를 구해보았는데,
결국 V = (Day * A) - ((Day -1)*B) 라는 식을 얻을 수 있었다.
나를 포함, 많은 사람들이 Day = V/(A-B) 공식으로
문제에 접근을 하는데, 이 경우엔 문제에서 말한 것 처럼
낮에 V에 도착 시, 그 날 밤엔 떨어지지 않는다, 라는 가정에
오류가 생기기에, 위 표에서 처럼 결국 도착 날 (Day)는
문제에서 구하고자 하는 건 Day 기 때문에,
Day = (V - B) / (A - B) 라는 식을 얻을 수 있었고
이 식을 이용해 Day 를 출력하면 소수점 까지 반환 한
수를 얻을 수 있다. (예를 들어 2,1,5를 입력 시 4.0 반환)
이 때, 두 가지 조건을 통해서 답을 얻어 내야 정답을 맞출 수 있는데,
1. 만약 Day 의 값이 1.4 처럼 나오는 경우
2. Day의 값이 1.0 처럼 딱 떨어지게 나오는 경우.
이 경우를 가정해서, 1번의 경우 2가 출력되도록 int(day) + 1을 해줬고
1.0 처럼 딱 떨어질 경우엔 그대로 int(day)가 출력 되게 해서,
낮에 V까지 올라갔는데, 밤에 B만큼 떨어져서 day가 추가 되는 일을 방지했다.
많은 깨달음을 준 문제지만..
그만큼 많은 시간이 소요됐다.