새벽을 밝히는 붉은 달
[C] CodeWars: <6kyu> Bouncing Balls 본문
Problem
A child is playing with a ball on the nth floor of a tall building. The height of this floor, h, is known.
He drops the ball out of the window. The ball bounces (for example), to two-thirds of its height (a bounce of 0.66).
His mother looks out of a window 1.5 meters from the ground.
How many times will the mother see the ball pass in front of her window (including when it's falling and bouncing?
Three conditions must be met for a valid experiment:
- Float parameter "h" in meters must be greater than 0
- Float parameter "bounce" must be greater than 0 and less than 1
- Float parameter "window" must be less than h.
If all three conditions above are fulfilled, return a positive integer, otherwise return -1.
Note:
The ball can only be seen if the height of the rebounding ball is strictly greater than the window parameter.
Example:
- h = 3, bounce = 0.66, window = 1.5, result is 3 - h = 3, bounce = 1, window = 1.5, result is -1 (Condition 2) not fulfilled).
int bouncingBall(double h, double bounce, double window) {
if(h > 0 && bounce > 0 && bounce <1 && window < h){
int cnt = 1;
for(int i = 0; h * bounce >= window; h = h * bounce){
if (h * bounce > window){
cnt += 2;
}
}
return cnt;
}
else
return -1;
}
처음으로 CodeWars라는 사이트에서 풀어본 문제이다.
알고리즘 사이트를 찾던 도중, 백준과 더불어 같이 풀어보면 좋을 것 같다는 사이트라길래 가입하여 풀어보았다.
확실히 영어라, 읽는 속도라던가 머릿속에 변수를 어떤 식으로 지정해야할지가 한번에 떠오르지 않더라.
좀 더 영어를 자주 읽고, 익숙해지도록 노력해야겠다.
이 사이트는 모든 문제가 그런 것인지는 모르지만, 스켈레톤 코드가 주어지기 때문에 좀 편했다.
덕분에 1학기 때 교수님께서 내주신 과제를 하는 기분도 들었다. 1학기 때 과제가 영어로 나왔기 때문에...ㅋㅋㅋㅋㅋㅋㅋ
아무튼 이 문제를 풀어보자면!
나는 첫번째 떨어뜨릴 때 무조건 window를 지나기 때문에 cnt를 1로 지정,
그 후 튀어오를 때마다 2씩 증가하는 형식으로 풀었다.
근데 생각해보면 bounce가 딱 window높이만큼만 올라올 때를 따로 케이스를 빼서 생각해야하지 않나 싶은데,
안 넣었는데 맞아서..^^ 그냥 넘어가는걸로.
그리고 이 사이트가 좋은 점이, 문제를 풀고나면 다른 사람들의 코드를 볼 수 있다는 것이다.
그중에서 많이 배운 코드 하나만 가져오자면,
#include <math.h>
int bouncingBall(double h, double bounce, double window) {
// times = n*2-1, n is the greatest integer for which:
// h*bounce^n < window => n < log(window/h)/log(b)
int n = (int) ceil(log(window/h)/log(bounce));
return n*2-1;
}
(출처: https://www.codewars.com/kata/reviews/582476e5063860b6620000f8/groups/5869694e7ba2f51121000af3)
이 코드인데, 로그로 푼 것을 보고 정말 감탄했다!
고등학생 때 로그를 배우면서, 지수는 많이 써먹을 것 같지만 로그는 어디다 써먹나 생각을 했었는데
이럴 때 써먹는구나 싶었다. 다음번에 비슷한 문제가 있다면 로그를 써먹는 방법도 생각해봐야겠다
'Online Judge' 카테고리의 다른 글
[C] 백준 1065번: bool은 stdbool.h에! (0) | 2020.09.05 |
---|---|
[C] 백준 4673번: 런타임 에러는 언제 발생하는가? (0) | 2020.09.04 |
[C] 백준 18258번: 큐 개념을 다시 되새긴 문제 (0) | 2020.09.03 |
[C] 백준 1371번: 입력에 대해 공부한 문제 (0) | 2020.09.02 |
[C] Baekjoon #10809 알파벳 찾기 : 배열 초기화에 대해 공부 (0) | 2020.01.17 |