◎ 자료구조와 알고리즘/백준(BOJ) 문제풀이

[백준 / BOJ] 1358번 하키 (C++, Python)

reo91004 2022. 6. 5. 12:00
반응형

링크 : https://www.acmicpc.net/problem/1358

 

1358번: 하키

첫째 줄에 수 W H X Y P가 주어진다. P는 선수의 수이다. W와 H는 100보다 작거나 같은 자연수이고, H는 짝수이다. X와 Y는 절댓값이 100보다 작거나 같은 정수이다. P는 최대 50인 자연수이다. 둘째 줄부

www.acmicpc.net


문제


문제 풀이

뭔가 복잡해보이지만, 조건을 나눠서 풀면 쉽게 풀리는 문제다.

 

  • 사각형에 있을 경우
  • 왼쪽 반원에 있을 경우
  • 오른쪽 반원에 있을 경우

 

위 조건들로 만들어주었다.

 

C++ 상세 풀이

더보기
int calc_dist(int x, int y, int a, int b) {
    return ((x - a) * (x - a)) + ((b - y) * (b - y));
}


for (int t = 0; t < P; ++t) {
    int x, y, r = (H / 2) * (H / 2);
    std::cin >> x >> y;

    // 사각형 안에 있는지 판별
    if (X <= x && x <= X + W && Y <= y && y <= Y + H)
        cnt++;
    // 왼쪽 반원에 있는지 판별
    else if (calc_dist(X, Y + (H / 2), x, y) <= r)
        cnt++;
    // 오른쪽 반원에 있는지 판별
    else if (calc_dist(X + W, Y + (H / 2), x, y) <= r)  
        cnt++;
}

핵심 코드는 위와 같다.

Python 상세 풀이

더보기
def calc_dist(x, y, a, b):
    return ((x - a) * (x - a)) + ((b - y) * (b - y))
    
# 사각형 안에 있는지 판별
if (X <= x and x <= X + W and Y <= y and y <= Y + H):
    cnt += 1
# 왼쪽 반원에 있는지 판별
elif (calc_dist(X, Y + (H / 2), x, y) <= r):
    cnt += 1
# 오른쪽 반원에 있는지 판별
elif (calc_dist(X + W, Y + (H / 2), x, y) <= r):
    cnt += 1

핵심 코드는 위와 같다.

 

코드 전문

C++

 

Python

 

소감

 

반응형