[Java] 백준 15894번: 수학은 체육과목 입니다.

hansung's·2024년 2월 29일
0

문제 url:
수학은 체육과목 입니다

문제:

🐱‍👤 실제 코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        br.close();

        long result = N * 4L;

        System.out.println(result);

    }
}

쉽게 풀 수 있는 문제이다. 사실 정답율이 54퍼라서.. 조금 생각하면서 풀었는데, 풀면 풀 수록 이걸 생각해야하는가? 했다. 역시나... 코더는 본인을 너무 믿어도 안되지만 그렇다고 너무 과소평가하면 안된다는 것을 이 문제를 보고 깨달았다.

😎 풀이 해석

그림을 그려보면 매우 심플할 수 있지만, 먼저 말로 설명을 하면
정사각형 1개 => 4
정사각형 1 + 2 => 8
정사각형 1 + 2 + 3 => 12
정사각형 1+ 2 + 3+ 4 => 16
즉, 실선의 길이는 4의 배수임을 알 수 있다.
또한 필자는 위에 말했듯이 조금 고민하면서 풀었다고 했는데, 풀이는 간략히 설명하면


그림 대충 그린거 아니다. 손재주가 없는거다

보기 힘들겠지만, 검은색으로 덧칠한 것을 보면 결국 각 층마다. 길이가 3만큼 남는다는 것을 알 수 있다.
그러면 마지막 층은 윗변(0.5 + 0.5)과 좌우 각각 1변씩하면 총 길이 3 그리고 마지막 밑변인 N을 구하면 마지막 층의 길이도 구할 수 있다.

즉 이를 수식화 하면 3n + n으로 계산할 수 있다.
필자는 이렇게 계산했지만, 결국 뭘하든 4n과 동일해서 4n으로 구했다.

하지만, 이 문제가 정답율이 낮은 이유는 알고리즘이 어려운 것이 아닌,
바로 데이터 타입과 관련이 있다.

이걸 4번만에 맞췄다.. 3번째 틀렸을 때, 공식이 잘못되었나 해서 공식이 적힌 블로그를 찾아 글을 읽었는데, 그 블로그 마저 오답 풀이를 적어놔서 혼돈의 카오스였다


문제를 잘 읽어보면 입력값이 1<= n <= 10 ^ 9승으로 나타나있다.
그렇다, 1,000,000,000 10억개의 층까지 고려해야 하는 문제로,

int형은 -2,147,483,648부터 2,147,483,647(약 21억)까지의 정수 값을 표현할 수 있다.
근데 현재 풀이는 4n으로 만약 n에 10억값이 들어가면 최대 40억까지 값을 표현하게 되는데,
이는 int형 변수의 범위를 초과하게 되어 오버플로우가 발생할 가능성이 있습니다.
그래서 int형이 아닌 long으로 데이터 타입을 지정해 큰 값도 안전하게 처리하도록 해야 풀 수 있습니다.

long result = N * 4L; 여기서 마지막 L을 넣음으로써, long으로 인식하게 하여, 정확하게 계산하도록 합니다.

그러면 L을 안붙이면????

자바에서는 정수 리터럴(값 자체)은 int로 간주되지만, 뒤에 L을 붙이면 long으로 해석하게 됩니다. 만약 여기서 L을 생략하게 된다면, 4는 int형으로 인식하여 N이 int형 범위를 벗어나게 되면 오버플로우가 발생할 수 있습니다.

다른 예로는 float의 F가 존재합니다.

🤢 회고

크음.. 코더인 본인을 너무 믿으면 안되지만, 그렇다면 너무 못믿어도 안된다는 것을 이 문제로 알게되었다.
조금 더 자신감을 갖고 문제를 풀어보도록 하고

int형 float형 long형 double형 등, 해당 데이터 타입에는 범위가 존재하고 이것이 N이 10 ^9승처럼 큰 숫자가 들어가면 그에 맞는 데이터 타입을 확실히 구할 수 있어야 한다는 것을 배우면서 데이터 타입에 관심을 가지게 되었다.

데이터 타입의 중요성을 이 문제로 확실히 알고 나니 데이터 타입을 공부해야 한다는 이유를 알 수 있었습니다. 다음 시간에는 데이터 타입에 대해 알아보도록 해보겠다.

profile
ABAPER를 꿈꾸는 개발자

0개의 댓글