🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

7강 1940 런타임 에러

23.06.20 13:25 작성 조회수 172

0

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

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

        int N = Integer.parseInt(tk.nextToken());
        int M = Integer.parseInt(tk.nextToken());
        int[] nums = new int[N + 1];

        for (int i = 1; i < N + 1; i++)
            nums[i] = Integer.parseInt(tk.nextToken());

        Arrays.sort(nums);

        int start = 1, end = N, answer = 0;

        while (start != end) {
            int sum = nums[start] + nums[end];

            if (sum < M) start++;
            else if (sum > M) end--;
            else {
                answer++;
                start++;
                end--;
            }

            if (start > end) break;
        }
        System.out.println(answer);
    }
}

안녕하세요 ~
항상 좋은 강의를 만드시기 위해 노력해주셔서 감사합니다!
강사님의 강의를 참고해 위 코드로 재출을 했는데 인텔리제이에서는 정상적으로 실행되지만,
백준에 재출했을 때 런타임 오류가 발생하는 이유를 모르겠어서 질문드립니다 ㅠㅠ

오류 코드는 아래와 같습니다.

Error: Main method not found in class Main, please define the main method as: public static void main(String[] args)

제대로 main 객체와 메서드가 있는데 왜 인식을 못하는지 모르겠네요 ㅠㅠ

감사합니다 :)

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.06.21

안녕하세요, 인프런 AI 인턴이에요.

먼저 해당 코드의 문제점을 봤을 때, 입력을 받는 부분이 문제가 있습니다. BufferedReader는 하나의 입력 스트림에서 문자를 버퍼링하여 문자, 배열 또는 라인 단위로 문자를 읽습니다. StringTokenizer는 주어진 문자열을 지정된 구분자를 기준으로 분리하여 토큰으로 만듭니다. 그러나 해당 코드에서는 입력값을 받을 때 한 번에 한 줄씩 입력을 받지 않고, 한 줄을 받고 StringTokenizer를 통해 나눈 뒤 남은 입력값을 또 다시 그대로 StringTokenizer를 통해 나누는 오류가 있습니다.

따라서, 입력값을 받는 부분을 아래와 같이 수정해주시면 됩니다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tk = new StringTokenizer(br.readLine());

int N = Integer.parseInt(tk.nextToken());
int M = Integer.parseInt(tk.nextToken());
int[] nums = new int[N];

tk = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++)
    nums[i] = Integer.parseInt(tk.nextToken());

위와 같이 입력값을 받는 방법으로 수정해주시면 해당 코드도 정상적으로 실행될 것입니다. 해당 코드를 복사하여 백준에 재제출해보시고 결과를 확인해보세요.

참고로, 런타임 에러는 보통 배열의 크기를 초과하는 등 메모리 오류나 0으로 나누는 등의 오류로 발생할 수 있습니다. 따라서, 입력값 외의 다른 부분에서도 확인해보고 수정이 필요할 경우 수정해보시는 것이 좋습니다.

알파님의 프로필

알파

질문자

2023.06.25

답변 감사드립니다!

말씀해주신대로 다시 해보겠습니다!

채널톡 아이콘