[코테/Java/Lv.0] 각도 합치기

[PCCE 기출문제] 2번 / 각도 합치기

문제

일반적으로 두 선분이 이루는 각도는 한 바퀴를 360도로 하여 표현합니다. 
따라서 각도에 360의 배수를 더하거나 빼더라도 같은 각을 의미합니다. 
예를 들면, 30도와 390도는 같은 각도입니다.

주어진 코드는 각도를 나타내는 두 정수 angle1과 angle2가 주어질 때, 
이 두 각의 합을 0도 이상 360도 미만으로 출력하는 코드입니다. 
코드가 올바르게 작동하도록 한 줄을 수정해 주세요.

 

내 코드

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int angle1 = sc.nextInt();
        int angle2 = sc.nextInt();

        int sum_angle = (angle1 + angle2) % 360; // % 360이 수정한 부분
        System.out.println(sum_angle);
    }
}

 

풀이

예를 들어 angle1 = 180, angle2 = 290이면 둘이 합쳐 470이다. 합친 값 470을 360으로 나누고 나머지를 출력한다. %는 나눗셈의 나머지를 구하는 연산자이다.

 

다른 사람 풀이

나랑 같은 코드가 대부분이었는데 댓글에서 '비교 분기'라는 걸 발견했다. 처음 문제를 보고 떠올린 조건문을 사용하는 방식이다. 아래는 클로드에게 도움을 구해 정리한 내용!


비교 분기로 해야하는 이유? (= 더 빠르다)

CPU 입장에서 나눗셈을 수행하는 모듈러 연산(%)은 덧셈/뺄셈/비교 연산보다 훨씬 비용이 큼 (보통 수십~수백 배 느림)

이 문제처럼 두 각도(0~359)를 더한 값이 최대 718을 넘지 않는다는 걸 알고 있다면, 굳이 나눗셈을 쓸 필요 없이 if문으로 "360을 넘으면 360을 빼준다"라고 처리해도 결과는 같다. 이게 바로 비교 분기(comparison branch)로 해결하는 방식.

코드로 비교

모듈러 연산 버전 (원본)

int sum_angle = (angle1 + angle2) % 360;

비교 분기 버전

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int angle1 = sc.nextInt();
        int angle2 = sc.nextInt();

        int sum_angle = angle1 + angle2;
        if (sum_angle >= 360) {
            sum_angle -= 360;
        }

        System.out.println(sum_angle);
    }
}

왜 더 빠를까?

  • % 연산: 내부적으로 나눗셈 → 나머지 계산 (비용 큼)
  • if + -=: 비교 1번, 뺄셈 1번 (비용 매우 작음)

특히 이 문제는 값의 범위가 정해져 있어서 한 번의 뺄셈으로 360 미만으로 만들 수 있음. 그래서 % 대신 if문 하나로 대체가 가능함.

참고: 만약 범위가 더 넓다면?

만약 두 각도의 합이 360을 여러 번 넘을 수도 있는 경우라면, if 한 번으로는 부족하고 while문을 쓸 수 있음.

while (sum_angle >= 360) {
    sum_angle -= 360;
}

정리하면, 비교 분기는 나눗셈 연산을 피하고 조건문과 뺄셈으로 같은 결과를 얻어내는 최적화 기법. 알고리즘 문제에서는 이런 사소해 보이는 연산 하나가 시간 제한 통과 여부를 가르는 경우도 있음.