[codingame] MARS LANDER

newbieski·2021년 6월 28일
0

CodinGame

목록 보기
1/17

화성에 우주선을 착륙시켜야한다.
단, 조건이 있다.

  • 평평한 곳에
  • 우주선의 각도는 똑바르게(문제에서는 0도라고 표현)
  • 수평 속력은 20m/s 이하(절대값)
  • 수직 속력은 40m/s 이하(절대값)

그외 문제 조건들은 문제에서 확인하면 됨
https://www.codingame.com/multiplayer/optimization/mars-lander

문제는 1단계, 2단계로 주어지는데 1단계는 튜토리얼 수준임

접근 방법 - 1단계

  • 모든 조건이 단순화 된 상태라서, 수직 속력이 커지면 적절히 추력을 시켜주면 됨

접근 방법 - 2단계

  • 테스트 케이스도 여러개이고 할 일이 많음
  • 로켓을 목적지근처로 보내는 것과
  • 착륙을 하는 부분으로 나눠서 접근함

목적지 근처로 보내기

  • 완전 탐색 + 시뮬레이션
  • rotate를 -90 ~ 90으로 했을때와 thrust를 0 ~ 4로 했을때를 조합함
  • hspeed, vspeed를 구해서 이 상태로 착륙지의 중간에 해당하는 x지점으로 이동하는데 드는 시간을 구하고
  • |hspeed| + |vspeed|의 값이 최소가 되는 것은 rotate, thrust를 선택함
  • comp() 함수를 정의해서 사용함
  • 예외1 : 로켓의 진행방향이 지점에서 멀어지는 경우에는 hspeed가 적은 것을 선택
  • 예외2 : 목적지까지 진행방향에서 가장 높은 지점을 구하고, 이대로 가다가는 높은 지점에 충돌할 것으로 판단이 되면 수직 방향으로 추력을 높임

착륙하기

  • 목적지 근처 일때 착륙 시작 : 목적지 중앙 일정 범위 안에 있으면서 hspeed가 일정 값 이하인 경우
  • 로켓을 기울여야하는 경우 판단(-15 또는 15, 그냥 15가 적당했음)
    • |hspeed| K보다 클 때 (K = 20으로 했는데, 로켓이 착륙하다가 벗어나는 경우가 있어서 변경해보다가 10으로 줄임. 너무 작으면 hspeed 맞추느라 일을 제대로 못함
    • 착륙지의 양 끝점 근처에 있을때, 이대로 두면 로켓이 착륙점을 벗어날 것 같아서..
  • 추력을 높여야하는 경우 판단 : 수직 속력이 40보다 클때

후기

  • 테스크케이스별로 더 고민을 하면서 코드를 다듬으니 대충 통과는 함
  • 연료를 많이 남기는 순으로 랭킹이 부여됨
  • simulate를 더 정교하게 해보고 싶음
profile
newbieski

0개의 댓글