2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

정보/게임으로 배우는 알고리즘

[게임으로 배우는 알고리즘]MARS LANDER - EPISODE 1

파아란기쁨1 2023. 3. 2. 19:49
반응형

문제) https://www.codingame.com/training/easy/mars-lander-episode-1

 

Practice Conditions with the exercise "Mars Lander - Episode 1"

Want to practice coding? Try to solve this easy puzzle "Mars Lander - Episode 1" (25+ languages supported).

www.codingame.com

 

문제) 이 문제는 우주선을 안전하게 착륙시키는 것입니다.

규칙은 다음과 같습니다.

이 시뮬레이터는 화성 착륙선을 화성 하늘의 제한된 구역에 배치 합니다.

구역은 7000m 이고 높이는 3000m 입니다.

화성 표면에는 최소 1000m 넓이의 평평한 지형이 있습니다.

 

1초마다 현재 비행 매개변수(위치,속도,연료...)에 따라 프로그램은 화성 착륙선의 원하는 새 기울기 각도와 추진력을 제공해야 한다.

각도는 -90~90도 사이, 추진력은 0~4 까지의 값에서 제어한다.

이 단계에서는 추진력만 제어하고 경사각은 무조건 0이다.

이 게임은 대기 없이 자유 낙하를 시뮬레이션 한다. 

화성의 중력은 3.711m/s^2 이고 추진력 x의 경우 Xm/s^2 에 해당하는 미는 힘이 생성되고 X리터의 연료가 소비됩니다.

이와 같이 화성의 중력에 보상하기 위해서는 거의 수직에 가까운 위치에서 4의 추진력이 필요하다.

 

성공적인 착륙을 위해 착륙선은 다음을 수행해야 합니다.

  • 평지에 착륙한다.
  • 수직 방향으로 착지(경사각=0도)
  • 수직 속도는 절댓값<=40m/s
  • 수평 속도는 절댓값 <= 20m/s

이 퍼즐은 회전을 무시하고 목표 각도로 항상 0 을 출력할 수 있다.

성공하기 위해 화성 표면의 좌표를 저장 할 필요가 없다.

수직 착륙속도는 0에서 40m/s 사이이며 수평속도는 0이다.

착륙선이 떨어지면 수직 속도는 음수이다. 위로 올라갈 때 수직속도는 양수이다.

 

입력데이터

첫번째 줄에 화성 표면을 그리는데 사용되는 점의 갯수 surface_n

surface_n 개 만큼의 표면의 x,y 좌표

 

7개의 화성 착륙선의 위치 x,y, h속도,v속도(착륙선의 수평및 수직속도),연료,회전 각도,힘

 

출력데이터

회전각도,power 로 출력 0~4 이고 실제 추진력은 이전 턴 값의 +/- 1로 제한 된다.

 

문제풀이)

더보기
import sys
import math

# Auto-generated code below aims at helping you parse
# the standard input according to the problem statement.

surface_n = int(input())  # the number of points used to draw the surface of Mars.
land_y_pre = -1
land_target_h =0
for i in range(surface_n):
    # land_x: X coordinate of a surface point. (0 to 6999)
    # land_y: Y coordinate of a surface point. By linking all the points together in a sequential fashion, you form the surface of Mars.
    land_x, land_y = [int(j) for j in input().split()]
    print(land_x, land_y, file=sys.stderr, flush=True)
    if(land_y_pre==land_y) : land_target_h = land_y
    land_y_pre=land_y

# game loop
while True:
    # h_speed: the horizontal speed (in m/s), can be negative.
    # v_speed: the vertical speed (in m/s), can be negative.
    # fuel: the quantity of remaining fuel in liters.
    # rotate: the rotation angle in degrees (-90 to 90).
    # power: the thrust power (0 to 4).
    x, y, h_speed, v_speed, fuel, rotate, power = [int(i) for i in input().split()]
    print(x, y, h_speed, v_speed, fuel, rotate, power, file=sys.stderr, flush=True)
    dist = y-land_target_h
    if v_speed> -40: #떨어지는 속도가 40보다 천천히 떨어진다면 
        power = 3
    else:
        power = 4
    if(dist>1200 and v_speed>-40): #남은 거리가 1200 보다 더 남고 40보다 더 천천히 떨어진다면 남은 거리를 비율로 계산하자. 
        power = int(power*(1-dist/3000))

    # Write an action using print
    # To debug: print("Debug messages...", file=sys.stderr, flush=True)


    # 2 integers: rotate power. rotate is the desired rotation angle (should be 0 for level 1), power is the desired thrust power (0 to 4).
    print("0", power)

 

평평한 지역의 높이를 land_target_h 값으로 저장한 다음

떨어지는 속도가 40보다 천천히 떨어진다면 power=3, 아니라면 power=4 로 설정하자.

만약에 거리가 1200 이상이 남았다고 하면 남은 비율을 계산하여 power를 조정하자. 예를 들면 1200 이 남았다면 power의 0.6 값으로 결정하고 3000 이 남았다면 0 의 값으로 설정하여 멀리에 있으면 빨리 떨어지고 가까이에 있으면 천천히 떨어지도록 조절해야 한다.

 

반응형