[Java] 백준 2355번: 시그마

U·2023년 3월 20일

백준

목록 보기
31/116

💻 문제


일단 이해하자🤔

  • 처음에는 for문을 돌려 A와 B를 포함한 수들을 합하는 로직으로 풀었으나 당연하게도 시간초과로 틀렸다😅
  • 가우스의 덧셈 알고리즘을 활용해야 함을 (찾아서..) 깨달았고 주어진 수의 개수가 짝수일때, 홀수일때를 나눠서 조건을 설정해주었다.
    예를 들어, 1과 5가 주어졌을땐 주어진 수의 개수가 홀수이다. 그러므로 1과 5를 더한 6을 (5 - 1 + 1) /2만큼 곱해주고 가운데 숫자인 3을 더해준다. 이때 3은 (1 + 5) /2와 같다.
    1과 4가 주어졌을땐 주어진 수의 개수가 짝수이므로 1과 4를 더한 5를 (4 - 1 + 1) / 2만큼 곱해주면 합이 나온다.

가우스식 덧셈이란?
A부터 B까지 정해진 범위의 숫자들의 합을 구하려면 (A와 B의 합) * (A부터 B까지 숫자의 개수) / 2의 공식을 이용하면 된다. 이때 A부터 B까지 숫자의 개수가 홀수일때는 가운데 숫자가 하나 남으므로 (A와 B의 합) / 2를 더해주면 된다.

이 블로그의 사진을 인용했다!


👀 풀이

import java.io.*;
import java.util.StringTokenizer;

public class Main5 {
    public static void main(String[] args) throws IOException {
        BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(bfr.readLine(), " ");

        long X = Long.parseLong(st.nextToken());
        long Y = Long.parseLong(st.nextToken());
        long A = Math.min(X, Y);
        long B = Math.max(X, Y);
        long sum = (A + B) * ((B - A + 1) / 2);

        if((B - A) % 2 == 0) {
            sum += (A + B) / 2;
        }

        bfw.write(String.valueOf(sum));

        bfr.close();
        bfw.flush();
        bfw.close();
    }
}

💡 결과


아쉬웠던 점••

  • 비록 가우스의 덧셈을 사용해야함은 질문 게시판을 통해 알아냈으나 그 뒤의 로직은 생각해내서 풀었고 예제와 여러 반례들을 넣었을때도 답이 맞게 나와 틀릴거라고는 생각을 못했는데

    이와 같은 틀렸습니다 의 향연이었다..
    왜일지 생각해봤는데 문제에서는 두 정수 A와 B가 주어졌을 때, 두 정수 사이에 있는 수의 합을 구하는 프로그램을 작성하시오. 라고 했다. 그 어디에서도 A부터 B까지 정수의 합을 구하라는 말은 없었다. 나는 당연하게도 A를 min, B를 max로 생각해서 풀었더니 틀렸던 것이었다 ㅜㅜ
  • Math.max(X, Y)Math.min(X, Y)를 이용해서 minmax를 구하고 계산하도록 했더니 맞았다(^^)

내가 맞았다고 생각했을때도 틀렸을땐 문제를 다시 읽어보자

profile
백엔드 개발자 연습생

0개의 댓글