인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

brigade98님의 프로필 이미지

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

2-H

2-H 하나의 문자를 입력 받을 때 런타임 에러

작성

·

46

0

안녕하세요, 큰돌님.

http://boj.kr/f7198ad0aa0740abb6a3d6f9cb33c43e

2-H 에서 입력 받은 s가 "a" 같은 하나의 문자일 때 런타임 에러가 떴습니다.

계속 수정하다 보니 모음 or 자음 3개 연속 조건 부분의 코드 문제인 것 같았습니다.

for(int i = 0; i < s.size() - 2; i ++)

그래서 s가 하나의 문자일 때를 나눠서 계산하였습니다.

// s가 문자일 때
        if(s.size() == 1)

이렇게 하니 맞긴 했는데 코드가 너무 난잡해진 것 같습니다...

  1. 기존 방식의 런타임 에러의 이유

  2. 제 코드보다 더 좋은 해결 방안이 있을까요?

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ

기존 틀리신 코드 전체 공유부탁드립니다.

감사합니다.

brigade98님의 프로필 이미지
brigade98
질문자

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ

.size()는 unsigned int를 반환해서 나타나는 문제인데요.

기존코드에서 조금만 수정해서 -> 충분히 맞았다고 뜰 수 있습니다.

for(int i = 0; i < (int)s.size() - 2; i ++){

이부분만 고쳐보시겠어요?

자세히 설명하자면 다음과 같습니다.

여기서 s.size()는 unsigned 타입(예: size_t)입니다.

  • 여기서 s.size()가 1이면 s.size() - 2는 음수가 되어 unsigned 연산으로 큰 값이 됩니다.

    그러면 조건 i < s.size() - 2가 사실상 항상 참이 되어 루프가 무한히(혹은 매우 큰 수 만큼) 실행되고, 결국 s[i + 2] 접근 시 범위를 벗어나 런타임 에러(예: segmentation fault)가 발생하게 됩니다.

 

다른 부분은 모두 훌륭하게 잘 짜셨습니다.

 

이부분은 제가 교안에서도 알려드리고 있는데 좀 더 보강하도록 하겠습니다.

스크린샷 2025-03-05 오전 8.30.11.png.webp

 

 

 


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.