ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 배열의 길이
    컴퓨터 공학/C++ 2023. 3. 10. 15:22

    오늘도 어제와 같이 단계 별로 풀어보기에 새로 등록된 2743번 문제를 풀던 중 갑자기 궁금한 것이 생겨 정리해보려 한다.

     

    https://www.acmicpc.net/problem/2743

     

    2743번: 단어 길이 재기

    알파벳으로만 이루어진 단어를 입력받아, 그 길이를 출력하는 프로그램을 작성하시오.

    www.acmicpc.net

    일단 문제 자체는 단순히 배열의 길이를 구하는 문제이다. 우선 입력할 수 있는 단어의 총 길이는 최대 100까지길래 아래와 같이 처음부터 배열을 선언해주었다.

    char S[101] = { 0 };

    char형 배열의 마지막은 무조건 NULL이 들어가기에 101로 선언. 사실 동적할당을 쓰면 이래저래 더 깔끔한 코드가 되겠으나 문제 풀이할 때는 쓰지 않는다.

    이전 포스팅에서 말했듯이 굉장히 원시인 같은 습성을 가지고 있었기에 이것도 맨날 함수를 만들어서 쓴 적이 있었다 ㅋㅋ 배열의 길이를 구하기 위한 함수를 만드는 방법을 두 가지로 구분해서 썼었는데, 입력값으로 글자 수가 주어질 경우와 그렇지 않은 경우이다. 주어지는 경우에는

    int num_of_word = 0;

    for (int i = 0; i < 글자 수; i++) {
      num_of_word++;

    }

    이런 식으로 글자 수에 맞춰 반복문을 돌리며 하나씩 카운팅을 하는 방식이고, 주어지지 않는 경우에는

    int num_of_word = 0;

    for (int i = 0; i < 100(배열의 최대 크기); i++) {

      if (S[i] == 0) break;

      num_of_word++;

    }

    이런 식으로 배열 내에 나올 수 없는 값과 비교해서 해당 값이 나오면 반복문을 탈출하는 방식을 사용했었다.

    하지만 이제는 신문물을 적극 수용하자는 입장으로 바뀌었으니 열심히 수용하고자 배열의 길이를 구하는 함수들을 찾아보았다.

     

    1. sizeof() 사용

    일단 sizeof 함수를 사용하는 경우는 sizeof 함수 한 번으로는 바로 배열의 길이를 구할 수는 없다. sizeof 함수는 메모리의 크기 자체를 반환하기에 아래와 같이 그냥 S를 넣어버리면

    cout << num_of_word << " " << sizeof(S);

    오잉? 처음에 선언했던 값인 101이 그대로 나와버린다. 그래서 sizeof 함수를 사용할 때는 처음부터 크기가 고정된 배열을 선언하기보다 동적할당을 할 때 사용하는 것이 나을 듯 하다. 굳이 방법을 찾아보자면 sizeof S / sizeof S[0]와 같이 배열의 전체 크기를 배열 요소 하나로 나누면 배열의 크기가 나온다고 한다. 그런데 이걸 굳이 쓸 이유가 있을까? 사실 내가 처음에 말했던 방법들과 그렇게 큰 차이가 나지 않는 것 같으니 진짜 한 줄로 끝낼 수 있는 방법을 이어서 찾아보자.

     

    2. strlen() 사용

    음 이거는 C언어에서부터 많이 사용하는 함수이다.

    cout << strlen(S);

    그냥 배열을 집어넣기만 하면 된다.

    잘 나온다. 그런데 처음에 S배열을 선언할 때 0으로 초기화를 해주었는데, 그렇다면 원래 지금 배열은 {p, u, l, l, j, i, m, a, 0, 0, 0 ...... , 0} 와 같은 형태로 되어있을 것이다. 하지만 배열의 길이를 101이 아닌 8로 출력한 것으로 보아 0을 배열의 끝으로 보는 느낌이다. 궁금해서 strlen 함수가 선언된 곳으로 가봤는데 이해가 안돼서 스킵 ^^;

     

    3. std::array의 size() 사용

    이것도 조금 재밌었다. array라고 명명되어 있고 형태 또한 { }로 되어 있길래 '오, 설마?'하는 느낌으로 .size()를 붙여 보았지만 바로 나의 멍청함을 깨달았다. 애초에 '.'이 들어가면 객체가 선언되어 있어야 하는데... 이래서 개념이 중요한가보다.

     

    4. std::vector의 size() 사용

    당연한 이야기지만 벡터 또한 이러한 함수가 존재한다. 그러나 array와 vector는 웬만하면 문제 풀이에는 쓰지 않을 것이므로 패스.

     

    결론

    나와 같은 경우는 strlen 함수를 애용하자.

    '컴퓨터 공학 > C++' 카테고리의 다른 글

    endl과 \n 차이  (0) 2023.04.03
    string  (0) 2023.03.31
    binary_search()  (0) 2023.03.29
    배열의 동적 할당  (0) 2023.03.22
    reverse()  (1) 2023.03.09
Designed by Tistory.