[백준 2941][C++] 크로아티아 알파벳, segfault, size_t

2023. 7. 22. 20:25·코딩 공부/백준(C++)

https://www.acmicpc.net/board/view/122419#post

 

글 읽기 - 문제는 풀었지만, segfault가 나옵니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net


◆문제의 시작
문제에 대한 로직을 작성하고 제출하니 90%에서 segfault가 나왔다.

하지만 아무리 생각해도 범위 밖을 나가지 않았다고 생각해 백준에 질문을 올렸다.

 

●아래는 코드 전문이다.

#include <iostream>
#include <string>

int main()
{
    std::string array;
    getline(std::cin, array);
    int answer = array.size();

	//문자열을 검사한다.
    for (int i = 0; i < array.size() - 1; i++)
    {
    	//2글자로 이루어진 크로아티아 알파벳을 발견시 길이에서 1을 뺀다.
        if (array[i] == 'l' || array[i] == 'n')
        {
            if (array[i + 1] == 'j')
            {
                answer--;
            }
        }
        if (array[i] == 'c' || array[i] == 'z' || array[i] == 's')
        {
            if (array[i + 1] == '=')
            {
                answer--;
            }
        }
        if (array[i] == 'c' || array[i] == 'd')
        {
            if (array[i + 1] == '-')
            {
                answer--;
            }
        }
    }
    for (int i = 0; i < array.size() - 2; i++)
    {
    	//3글자로 이루어진 크로아티아 알파벳을 발견시 위에서 1을 빼주었기 때문에 길이에서 1만 뺀다.
        if (array[i] == 'd')
        {
            if (array[i + 1] == 'z')
            {
                if (array[i + 2] == '=')
                {
                    answer--;
                }
            }
        }
    }
    std::cout << answer;
}

 

◆해결

몇 분 안되서 답변이 작성되었는데, string의 size() 함수의 리턴값이 typedef usigned long long size_t; (64비트)라서 언더플로우를 통해 무한 루프를 돌게 된다는 답변을 받았다.

메모리의 저장공간을 나타내는 size_t 자료형은 해당 시스템에서  어떤 객체나 값이 포함할 수 있는 최대 크기의 데이터를 표현하는 타입으로 반드시 unsigned 형으로 나타낸다.

테스트 케이스로 하나의 단어만 들어갈 경우 아래의 부분에서 i < 18446744073709551615(1 - 2) 가 되버리는 것이다.

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

그렇게 무한루프를 돌순 있지만 18446744073709551615이라는 비정상적인 크기를 감당할 수 없어 에러가 난것이다.

 

위의 반복문에서 -2는 문자열을 확인할때 i기준으로 뒤에 두자리까지 확인하기 때문에 Out of Array를 걱정해서 넣어 줬는데, 정작 -2를 안해주어도 쓰레기값을 검사해서 오류가 나진 않았다.

그 쓰레기값 조차 d 다음 z 다음 = 을 만족을 시키긴 천문학적으로 어렵기 때문에 백준에서도 답 처리 되었다.

 

◆결론

size_t는 unsigned 자료형이며 해당 시스템에서  어떤 객체나 값이 포함할 수 있는 최대 크기의 데이터를 표현하는 타입이다.

※size_t와 size_type은 C++에서 같다.

 

●아래 코드는 size 함수를 int형인 answer에 넣어 암시적 형변환을 시켜주어 해결하였다.

#include <iostream>
#include <string>

int main()
{
    std::string array;
    getline(std::cin, array);
    int answer = array.size();

    for (int i = 0; i < array.size() - 1; i++)
    {
        if (array[i] == 'l' || array[i] == 'n')
        {
            if (array[i + 1] == 'j')
            {
                answer--;
            }
        }
        if (array[i] == 'c' || array[i] == 'z' || array[i] == 's')
        {
            if (array[i + 1] == '=')
            {
                answer--;
            }
        }
        if (array[i] == 'c' || array[i] == 'd')
        {
            if (array[i + 1] == '-')
            {
                answer--;
            }
        }
    }
    for (int i = 0; i < array.size() - 2; i++)
    {
        if (array[i] == 'd')
        {
            if (array[i + 1] == 'z')
            {
                if (array[i + 2] == '=')
                {
                    answer--;
                }
            }
        }
    }
    std::cout << answer;
}

'코딩 공부 > 백준(C++)' 카테고리의 다른 글

[백준 2607][C++] 비슷한 단어  (0) 2023.08.11
[백준 15686][C++] 치킨 배달  (0) 2023.08.09
[백준 9658][C++] 돌 게임 4  (0) 2023.08.09
[백준 16974][C++] 레벨 햄버거  (0) 2023.08.07
[백준] 11659번 : 구간 합 구하기 4 [C++]  (0) 2023.02.04
'코딩 공부/백준(C++)' 카테고리의 다른 글
  • [백준 15686][C++] 치킨 배달
  • [백준 9658][C++] 돌 게임 4
  • [백준 16974][C++] 레벨 햄버거
  • [백준] 11659번 : 구간 합 구하기 4 [C++]
메카인
메카인
  • 메카인
    메카인의 지식창고
    메카인
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩 공부
        • TIL(Today I Learn)
        • TIL
        • 백준(C++)
        • Python
        • 알고리즘
        • 프로젝트 회고
      • C++
        • C++
        • C++ STL
        • C,C++ mCoding yotube
      • 게임개발
        • 언데드서바이벌_골드메탈_클론코딩
        • 3D_골드메탈_클론코딩
        • 유니티_문제해결
        • 게임 수학
      • Unreal 공부
        • UE5 GameDev
        • Unreal Engine 4 C++ The Ult..
      • 교재 문제 풀이
        • 운영체제
      • 정보처리기사
        • 정처기 요약
        • 정처기 오답노트
      • 학교수업
        • 데이터베이스
        • 프로그래밍 언어론
        • 리눅스 시스템
        • 네트워크
      • 일상
        • 주식
        • 독서
      • (비공개 전용)
        • memory
        • Build
        • OOP
        • Smart Pointer
        • lamda
        • 게임 수학
        • 모던 C++
        • 모던 C++ STL
        • 모던 C++ Concurrency, Paralle..
        • 책
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 블로그 관리
  • 링크

  • 공지사항

    • 공지사항 - 인생과 블로그의 목표
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
메카인
[백준 2941][C++] 크로아티아 알파벳, segfault, size_t
상단으로

티스토리툴바