문자열의 활용

박상록(Sangrok Park)·2021년 2월 6일
0

Computer Science Basic

목록 보기
13/13

프로그래밍은 결국 추상화를 이용해서 복잡한 기계어를 간단하게 처리하는 것

CS50자체 라이브러리에 문자열길이를 구하는 함수 strlen
교수님은 그냥 for문을 쓸 때

striing s = "어떤 문장열";

for(int i = 0; i < strlen(s); i++) 
{
  printf("%c", s[i]);
}

이렇게 쓰면 strleng()호출을 매 반복문이 돌 때마다 "호출"해야 하기 때문에,

striing s = "어떤 문장열";

int n = strlen(s);
for(int i = 0; i < n; i++) 
{
  printf("%c", s[i]);
}

이렇게 변수에 문자열 길이를 할당해 놓고, 반복문 안에서 돌리면,

개선 된 방법은 엄밀히 얘기하면, 공간복잡도 즉 메모리가 차지하는 공간이 더 늘어난다는 단점? 이 있기는 하지만,

시간복잡도와 공간복잡도, 둘중에무엇을 선택해야 하는지 어떤게 더 중요한지를 바라볼 때,
위 예시는 아주 단순하고 작은 예시같지만 중요한 토픽인 것 같다.

문자끼리의 비교

string s = "abcdef"
if(s[0] > s[1]) 
{
    // 무엇을 해라
} 
 

이렇게 문자열 끼리 비교하면 무슨 기준으로 하는 것일까?

바로 아스키 코드이다

신기하게도, 알파벳 대문자에서 32만 더하면 같은 알파벳 소문자가 된다.

그래서 이 강의에서는, 문자열을 순회하며 모든 글자를 대문자로 만들고 싶을 때,

반복문안에서

// s라는 문자열 선언
// 위는 for문 로직
  if(s[i] >= 'a'&& s[i] <= 'z')
  {
      printf(%c, s[i] - 32)
  }

즉 문자 하나가 "a" 보다 크거나 같고, "z"보다 작거나 같으면(소문자만 걸른다는 뜻)
저렇게 -32해주면 모든 글자를 대문자로 변환하여 출력하게 된다.

아스키 코드를 이용하여 대문자로 바꾸다니, Javascript toLowerCase(), toUpperCase() 도 같은 로직이려나??

최대한 기계어와 가까운 방식이라고 한다.
워드, 구글 독스 같은 곳에서도 같은 방식을 수행하여, 대문자 소문자로 바꾼다고 한다.

하지만 이것은 매우 복잡 혹은 코드가 길게 쓸 수 밖에 없으니,

이것을 위해 만들어진 함수를 써보자.
쓰기 위해서 파일을 가져오고, 프로토타입을 선언해야하는데,

CS50 웹사이트에서 이런 문서들을 제공한다고 한다.
저것을 기반으로 보면

#include <ctype.h>

이란 파일을 헤더에 넣어야 하고

#include <ctype.h>

int toupper(int c);  
int tolower(int c);

프로토타입을 미리 선언해줘야 함수를 사용할 수 있다고 한다.

함수를 사용하려면

#include <ctype.h>

int toupper(int c);  
int tolower(int c);

// s라는 문자열 선언
for(int i = 0; n = strlen(s); i < n; i++){
    if(s[i] >= 'a'&& s[i] <= 'z')
    {
        printf(%c, toupper(s[i]);
    }
}

이런식으로 갔다가 쓰면 된다.

C뿐만 아니라, 자바스크립트에서도 내부적으로 어떻게 이 함수가 돌아가는 지 알게 된 것 같다.

여기서 학생질문, 왜 반복문안의 i는 int라는 타입 선언을, n에는 하지 않았는가?

-> 교수님: i와 타입이 같으면 같으면 n위치에 오는것은 하지 않아도 된다. 다만 다르다면 해야한다.

출처 : [부스트코스] 모두를 위한 컴퓨터 과학 (CS50 2019) (https://www.boostcourse.org/)

profile
한 줌의 소금과 같이 되고 싶은 개발자

0개의 댓글