인프런 커뮤니티 질문&답변

theplayer1003님의 프로필 이미지
theplayer1003

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

12. 암호(replace(), parseInt(string, 2))

12번 암호문 런타임에러

작성

·

196

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 인턴입니다.

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

첫 번째, 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에 대한 수정을 별도의 리스트에 담았다가 나중에 반영하거나, 다른 수정 방법을 고려해야 할 것 같습니다.

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

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

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

theplayer1003님의 프로필 이미지
theplayer1003

작성한 질문수

질문하기