[BOJ] 2077번 대소문자 바꾸기

Rang·2021년 3월 5일
0
post-thumbnail
📝 문제 링크

문제 설명
영어 소문자와 대문자로 이루어진 단어를 입력받은 뒤, 대문자는 소문자로, 소문자는 대문자로 바꾸어 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 영어 소문자와 대문자로만 이루어진 단어가 주어진다. 단어의 길이는 최대 100이다.

출력
첫째 줄에 입력으로 주어진 단어에서 대문자는 소문자로, 소문자는 대문자로 바꾼 단어를 출력한다.

예제 입력 : WrongAnswer
예제 출력 : wRONGaNSWER


제가 숏코딩에 관심이 있어서 코드를 풀이한 뒤 윗 분들은 어떻게 작성했나 코드를 들여다보는데, 제가 삼항 연산자를 사용해서 작성한 부분을 XOR연산자를 이용해서 작성하신 분이 계셔서 이 참에 공부하게 됐습니다. TMI~

기존에 제가 사용하던 대소문자 변환 코드
for(auto i:str) (int)i>=97? printf("%c",(int)i-32):printf("%c",(int)i+32);

앗 이 코드는 뭐지?!
printf("%c",i^32)

-> 여기서 쓰인 ^ 연산자는 비트 연산자 중 하나인 XOR 연산자입니다.
XOR 연산자는 다르면 참을, 같으면 거짓을 반환합니다.



대/소문자의 아스키코드에는 특징이 있는데요, 그건 바로

  • 대문자의 아스키 코드는 모두 여섯번째 비트가 0이다.
  • 소문자의 아스키 코드는 모두 여섯번째 비트가 1이다.
에이로 예시를 들어볼게요! 
에이 대/소문자는 각각 이러한 16진수값을 가집니다.
  • a=0x61
  • A=0x41
이것을 4자리씩 끊어서 2진수로 표현하면,
  • a=0110 0001
  • A=0100 0001
이 됩니다.
6번째 비트만 값이 다른 것 보이시나요?!

∴ 6번째 비트를 바꿔주면 대소문자가 바뀌겠구나~


32는 2진수로 100000 이라서(6번째 비트가 1),
32를 이용해서 XOR 연산을 하면 6번째 비트의 값이 바뀌며 대소문자가 변환됩니다!


코드

char str[100];
int main(void) {
    cin>>str;
    for(auto i:str) printf("%c",i^32);
    return 0;
}

* n진수 변환법 : 클릭!

0개의 댓글