[백준] 1876 - 튕기는 볼링공

2025. 3. 29. 13:04·알고리즘 (PS)/BOJ
반응형

문제 설명

https://www.acmicpc.net/problem/1876

 

지름이 20cm 인 볼링공을 너비 105cm 인 레인 위에서 굴린다.

볼링공이 구르기 시작한 첫 위치는 레인의 정 가운데 위치이고, 해당 위치에서 x도 각도로 굴린다.

굴러간 공은 레인 벽과 부딪히면 입사각과 동일한 각도로 반사되어 튕긴다.

볼링공이 구르기 시작한 첫 위치로부터 T 미터 떨어진 곳에 지름 12cm 인 볼링 핀이 있다.

 

처음 굴리기 시작한 각도 x 와 볼링공과 볼링핀 사이 거리 T 가 주어질 때, 이 볼링공이 볼링핀을 맞히는지 여부를 출력하라.

 

 

접근 방법

우선 각도에 따라서 공이 여러번 튕길 수 있고, 매번 튕기는 것을 다 시뮬레이션으로 구현하는 것은 너무 복잡해보였다.

그래서 수학적으로 문제를 풀 수 있을 것 같아서 태블릿에 그려가면서 문제를 추상화해보았다.

 

 

처음에는 단순히 직선을 그려서 튕기는 과정을 생각했는데, 움직이는 건 점이 아니라 공이므로 공이 움직이는 방법으로 추상화해야 한다.

공이 이동하는 것을 공의 중심이 이동하는 과정으로 추상화 해보면, 볼링공의 반지름이 10cm 이므로 85cm 폭의 레인에서 점이 왔다갔다 하는 것으로 추상화할 수 있다.

 

볼링핀도 똑같이 점으로 추상화하면, T미터 떨어진 곳에 점을 찍고 이 점과 볼링공의 이동경로 직선사이 거리를 재서 그 거리가 볼링핀의 반지름과 볼링공의 반지름 합인 16cm 미만이면 충돌한다고 볼 수 있다.

 

근데 입사각과 반사각을 고려하면 직선 식을 매번 바꿔서 계산해야 하기 때문에 불편하다.

 

 

볼링공이 튕기는 과정을 이렇게 확장해서 생각하면

입사각과 반사각이 같다는 점을 이용해 레인을 옆에 이어 붙여서 하나의 직선으로 계산하도록 변환할 수 있다.

이때 그림에서 보는 것처럼 볼링핀의 위치는 매번 85cm 씩 이동한 상태에 대해서 거리를 구하면 된다.

 

 

이제 구체적인 수식을 생각해보자.

먼저 좌표평면으로 이 문제를 생각하기 위해서 먼저 화면을 조금 돌려주었다.

볼링공의 시작 좌표를 (0, 85/2) 로, 볼링 핀의 위치를 (100*T, 85/2 + 85n) 로 둔다. (T는 단위가 미터이므로 cm로 변환해야 하며, 85cm 마다 볼링핀을 배치해서 생각해야 하므로 그 값을 n으로 두었다.)

 

볼링공이 100T cm 위치에 도착했을 때의 y 좌표를 y1 이라고 하고,

그 점을 기준으로 인근의 가까운 볼링핀의 y 좌표를 y2 라고 하고,

해당 볼링핀에서 볼링공의 이동경로 직선에 내린 수선의 길이를 k 라고 하면 (우리가 구하려는 것은 k 가 16 미만인지 확인하는 것)

 

p = | y1 - y2 | 라고 할 때

cos x = k / p

 

k = p cos x

 

라는 식을 구할 수 있다.

 

그런데 여기에서 계산을 더 간편하게 하기 위해, 모든 점과 직선을 -85/2 만큼 평행이동해서 생각해보면

최종적으로 원점을 지나는 기울기가 tan x 인 직선에 대해, 직선에서 제일 가까운 (100T, 85n) 위치에 있는 점의 거리가 16미만인지 확인하는 것과 같다.

 

이때 n 의 값은 (tan x) * 100T 값을 85로 나눈 몫과 그 앞 뒤 1칸을 생각하면 된다.

 

정답 코드

import sys
from math import tan, radians, cos
input = sys.stdin.readline

n = int(input())
for _ in range(n):
    t, x = map(float, input().split())
    rad_x = radians(x)
    a = tan(rad_x)
    t = t*100

    y = a * t
    ans = "no"
    for i in range(5):
        check_pos = (y//85 + i) * 85
        dist = abs(check_pos - y) * cos(rad_x)

        if dist < 16:
            ans = "yes"
            break

    print(ans)

 

tan 45 를 구하니까 계속 0.9999999 가 나와서 어떻게든 정밀도를 높여보려고 Decimal 을 썼는데, 그래도 1.0 은 결국 안나왔다.

어차피 구하는 것은 점과 직선 사이 거리가 16 미만인지만 구하면 되므로 이 정도 오차는 괜찮겠다고 생각해서 제출했고 AC를 받았다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 (PS) > BOJ' 카테고리의 다른 글

[백준] 14868 - 문명 (P4)  (0) 2025.04.24
[백준] 1248 - Guess (G3)  (0) 2025.03.20
[백준] 1166 - 선물  (0) 2024.11.13
[백준] 4315 - 나무 위의 구슬 (Python)  (0) 2024.11.12
[백준] 4436 - 엘프의 검  (0) 2024.11.09
'알고리즘 (PS)/BOJ' 카테고리의 다른 글
  • [백준] 14868 - 문명 (P4)
  • [백준] 1248 - Guess (G3)
  • [백준] 1166 - 선물
  • [백준] 4315 - 나무 위의 구슬 (Python)
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (615)
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (45)
        • 생각 정리 (23)
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[백준] 1876 - 튕기는 볼링공
상단으로

티스토리툴바