• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

12번 암호문 런타임에러

24.01.04 22:46 작성 조회수 87

1

14e972338646

 

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        int num = Integer.parseInt(kb.nextLine());
        String str = kb.nextLine();

        solution(str, num);
        kb.close();
    }

    private static void solution(String str, int num) {
        List<String> binlist = new ArrayList<>();

        for (int i = 0; i < str.length(); i += (str.length() / num)) {
            int end = Math.min(i + str.length() / num, str.length());
            binlist.add(str.substring(i, end));
        }

        for (String each : binlist) {
            StringBuilder tmp = new StringBuilder();

            for (char mos : each.toCharArray()) {
                if (mos == '#')
                    tmp.append(1);
                if (mos == '*')
                    tmp.append(0);
            }

            binlist.set(binlist.indexOf(each), tmp.toString());
        }

        for(String each : binlist){
            solution2(each);
        }
    }

    private static void solution2(String bin) {
        int ascii = Integer.parseInt(bin,2);
        System.out.print((char)ascii);
    }
}

다른 질문 글에도 런타임 에러 질문이 있는거 같은데 명확한 답변을 못 찾아 글을 올려봅니다.

 

12번 암호문제구요.

2,3,4,5 테스트 케이스 다 통과했다는데 1번 테스트케이스에서 런타임에러가 나옵니다.

다른 글에서 보니 1번은 문제에서 제시한 테스트케이스라는데 로컬에서는 정상 작동을 확인했습니다.

 

어떤 부분이 문제일까요? 런타임에러가 어떤 상황인지도 알고 싶습니다.

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.06

안녕하세요, 인프런 AI 인턴입니다.

님의 코드를 살펴보니 런타임 에러의 원인으로 추정되는 부분이 있습니다.

첫 번째, solution 메소드 내에서 str.length() / num을 활용하여 암호문을 나누고 있는데, 이 부분에서 str.length()num으로 정확히 나누어 떨어지지 않을 경우에 배열 범위를 벗어날 수 있습니다. 예를 들어, str.length()가 10이고 num이 3이라면 10 / 3 = 3으로 계산되고 마지막에는 암호문이 1글자가 부족하게 됩니다.

두 번째로, binlist.set(binlist.indexOf(each), tmp.toString()); 이 부분에서 수정하고자 하는 문자열들은 이미 for-each 루프에서 사용 중이기 때문에, 해당 문자열을 수정하는 과정에서 ConcurrentModificationException이 발생할 수도 있습니다.

solution 메소드에서 binlist에 대한 수정을 별도의 리스트에 담았다가 나중에 반영하거나, 다른 수정 방법을 고려해야 할 것 같습니다.

런타임 에러는 프로그램이 실행 중에 발생하는 오류를 의미합니다. 예를 들어 배열 범위를 넘어서 접근하려고 할 때나, 널 참조를 참조하려고 하는 등의 상황에서 발생할 수 있습니다.

로컬 환경에서 정상 작동하는 경우에도, 테스트 케이스에 따라 문제 상황이 발생할 수 있으므로 주의가 필요합니다.

정확한 원인을 파악하기 위해서는 문제의 테스트 케이스를 확인하는 것이 좋습니다. 에러 메시지를 확인하여 어떤 종류의 런타임 에러가 발생했는지 파악하고, 해당 상황을 재현해보세요.