몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 0] 대소문자 바꿔서 출력하기 {언어 : C언어} 본문

개발 언어 입문/C언어

프로그래머스 [Lv. 0] 대소문자 바꿔서 출력하기 {언어 : C언어}

스위태니 2024. 2. 14. 18:53

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/181949?language=c

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

#include <stdio.h>
#define LEN_INPUT 21

int main(void) {
    char s1[LEN_INPUT];
    scanf("%s", s1);
    for (int i = 0; s1[i] != '\0'; i++) {
        if(s1[i] >= 'A' && s1[i] <= 'Z')   
            s1[i] +=32;
        else if(s1[i] >= 'a' && s1[i] <= 'z')
            s1[i] -=32;
        printf("%c", s1[i]);
    }
    return 0;
}

풀이 방법

  1. LEN_INPUT의 값을 "\0"을 포함하여 20 + 1로 만든다
  2. 반복문을 통해 "\0"가 나올 때까지 반복한다. (문자의 끝 부분)
  3. 아스키코드를 이용해서 대문자와 소문자가 32가 차이나는 것을 고려하여 소문자는 - 32 대문자는 + 32를 해준다.

느낀점

  • 그래도 파이썬 배웠다고 어느정도 가다는 있음

인덱스를 사용하는 for 루프 예제

#include <stdio.h>

int main() {
    char str[] = "hello";
    for (int i = 0; str[i] != '\0'; i++) {
        printf("%c\n", str[i]);
    }
    return 0;
}

포인터를 사용하는 while 루프 예제

#include <stdio.h>

int main() {
    char str[] = "hello";
    char *p = str; // str의 첫 번째 문자를 가리키는 포인터
    while (*p != '\0') {
        printf("%c\n", *p);
        p++; // 포인터를 다음 문자로 이동
    }
    return 0;
}

추가로 비트 연산 사용

#include <stdio.h>
#define LEN_INPUT 21

int main(void) {
    char s1[LEN_INPUT];
    scanf("%s", s1);
    for (int i = 0; s1[i] != '\0'; i++) {
        s1[i] ^= 32;
        printf("%c", s1[i]);
    }
    return 0;
}

 

영문 알파벳의 대문자와 소문자 사이에는 ASCII 코드 값에 일정한 차이가 있습니다. 이 차이는 32입니다. ASCII 코드 표에서 대문자 'A'의 코드 값은 65이고, 소문자 'a'의 코드 값은 97입니다. 이 차이(32)는 대문자와 소문자 간의 변환에 사용됩니다.

ASCII에서 대문자와 소문자 사이의 차이를 이용한 대소문자 변환의 원리를 이해하기 위해, 비트 연산의 개념을 알아야 합니다. 특히, XOR 연산(^)은 이 경우 유용하게 사용됩니다.

비트 XOR 연산과 대소문자 변환

비트 XOR 연산은 두 비트가 서로 다를 때 1을, 같을 때 0을 반환합니다. ASCII 코드에서 대문자와 소문자 사이의 차이는 32이며, 이는 2진수로 00100000입니다. 이 비트를 대소문자 알파벳의 ASCII 코드 값에 XOR 연산하면, 대소문자가 서로 변환됩니다.

  • 대문자에서 소문자로 변환: 대문자 알파벳의 ASCII 코드에 00100000을 XOR 하면, 5번째 비트가 0에서 1로 변하면서 소문자로 변환됩니다.
  • 소문자에서 대문자로 변환: 소문자 알파벳의 ASCII 코드에 00100000을 XOR 하면, 5번째 비트가 1에서 0으로 변하면서 대문자로 변환됩니다.

예시

예를 들어, 대문자 'A'의 ASCII 코드는 65(01000001)입니다. 이 값에 00100000(32)을 XOR 연산하면, 결과는 97(01100001)이 되어 소문자 'a'의 ASCII 코드 값과 일치합니다.

01000001 (대문자 'A'의 ASCII 코드)
XOR 00100000 (32)
= 01100001 (소문자 'a'의 ASCII 코드)

 

반대로, 소문자 'a'의 ASCII 코드는 97(01100001)입니다. 이 값에 00100000(32)을 XOR 연산하면, 결과는 65(01000001)이 되어 대문자 'A'의 ASCII 코드 값과 일치합니다.

이렇게 XOR 연산을 사용하면, 영문 알파벳의 대소문자 변환을 간단하게 수행할 수 있습니다. XOR 연산은 특정 비트를 토글(toggle, 즉 0을 1로, 1을 0으로 바꾸는 작업)하는 데 사용되므로, 이러한 속성을 이용해 대소문자 변환에 활용하는 것입니다.