문제 풀이 환경을 제공하는 사이트로 codility를 알게되었다.
개구리가 우는 이유는 청개구리가 비오는 곳에 그들을 묻어서 라고 하던가?
첫번째 문제는 뛸 수 있는 거리(D)가 정해져 있고, 시작거리(X)에서 출발할 때, 몇 번(R) 되어야 종료거리(Y)를 넘을 수 있는가를 묻는다.
영어로 되어 있어서 잘 이해가 가지 않아, 역시 PHP 로 걍 해보다가 답을 보았다.
C언어로 된 답은 그리 간결하지 않다. 이를 PHP로 바꿔서 했더니, 정수가 안 나온다고 해서, 리턴 값을 보니, 2.5다.
C언어에는 타입이 정해져 있어서, 자동 반올림(? 올림일 가능성이 제기됨)되어 정수로 리턴해 줘서 문제가 없었던 듯.
암튼 PHP 로 고치면 아래와 같다.
function solution($X, $Y, $D) {
$r=0;
if($Y>$X)
{
$r=($Y-$X)/$D;
$r=floor($r);
if(($X+($r*$D)) < $Y)
$r++;
}
return intval(floor($r));
}
먼저 도달해야하는 곳(Y)이 시작점(X) 보다 뒤에 있는지 확인하고, 몇 번 뛰어야 하는지 계산한다.
예제 케이스를 넣어보면 첫번째 R은 2.5이다.
두번째 조건문은 85<80 이므로 거짓이어서 반올림 값만 적용되어 3이 나온다.
두번째 조건문이 왜 필요할까?
그건 첫번째 R에서 동일한 숫자가 나오면 ROAD를 벗어나는게 아닌, 걸치기(?) 때문이다.(글을 정리하면서 이해하게 되었다.)
그런 예라면, 시작 점(X)이 5라고 한 값을 보자.
첫번째 값은 2.666666 이고, 두번째 조건문이 80.0000001 이라 영향을 안 줄 듯.
윽... 이상하다. 두번째 조건문을 주석처리하고 테스트 케이스를 바꿔도 답이 맞는다.
그건 아니고, 테스트 케이스 값이 무엇이다만 리턴하는 듯.
그래서 처음에는 round인 줄 알았는데, 이러면 안 된다. 그래서 floor로 고쳤다.
제출 결과 어떤 테스트 케이스를 넣었는지는 모르겠지만, 통과했다.
나도 그 선을 넘고 싶다. 그런데, 세상은 올림과 반올림은 인정하지 않고, 버림아니면, 마이너스 밖에 없겠지.
https://codility.com/demo/results/demoTZD8DM-38J/
테스트 케이스의 답만 리턴할 것이 아니라, 가부 여부도 알려줘야 한다고 생각한다.
두번째 문제도 풀었다. 처음에는 바보 같이 존재하는 숫자를 순차대로 찾아서 배열에서 소거하려 했는데, 이게 아닌 연속되는 자연수의 합 원리를 이용하면 되는 거였다. 배열 총합을 빠진 숫자까지의 수열 합에서 빼면 누락된 수가 나온다.
https://codility.com/demo/results/demoNF4Q3B-A48/
3번 문제는 특정 부분을 잘랐을 때, 좌측부분의 합과 우측부분의 합의 차를 구하는 문제이다. 어려운 문제는 아닌데, 문제가 이해가 안 가서 이제야 적어놓는다.
댓글 달기