문제:
시도 횟수: 1번
처음 생각한 방법: 대문자 to 소문자, 소문자 to 대문자로 만들어주는 라이브러리나 함수가 있을것이라 예상함. 그래서 구글링한 결과 tolower, toupper라는 함수를 알게되었다.
내 코드:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
for(int i = 0; i < s.size(); i++) {
if(s[i] >= 'A' && s[i] <= 'Z')
s[i] = tolower(s[i]);
else
s[i] = toupper(s[i]);
}
cout << s << endl;
return 0;
}
모범답안:
#include <iostream>
#include <string>
int main() {
std::string word;
std::cin >> word;
// 단어의 각 문자를 확인하며 대소문자를 변환
for (char& c : word) {
if (c >= 'a' && c <= 'z') { // 소문자인 경우
c = c - 'a' + 'A'; // 대문자로 변환
} else if (c >= 'A' && c <= 'Z') { // 대문자인 경우
c = c - 'A' + 'a'; // 소문자로 변환
}
}
// 변환된 단어 출력
std::cout << word << std::endl;
return 0;
}
위 코드는 GPT에게 풀게 시킨 결과이다. 라이브러리를 안 쓰는 경우에는 아스키코드로 접근해서 생각한다.
각 문자에 - 'a' + 'A'를 해서 소문자를 대문자로 바꿀 수 있고, - 'A' + 'a'를 통해 대문자를 소문자로 바꿀 수 있다.
또한 각 문자를 확인하는 코드를 for(char& c : word)로 구현한 것이 인상깊다. 이런 range based for 구문은 이 문제를 풀고 몇일 뒤에 동기에게 들었었는데, 진작에 알았더라면 여기에 적용시킬수 있었을 것 같다.
#include <iostream>
#include <cctype> // toupper, tolower 함수를 사용하기 위해 포함
int main() {
std::string word;
std::cin >> word;
// 단어의 각 문자를 확인하며 대소문자를 변환
for (char& c : word) {
if (std::islower(c)) { // 소문자인 경우
c = std::toupper(c); // 대문자로 변환
} else if (std::isupper(c)) { // 대문자인 경우
c = std::tolower(c); // 소문자로 변환
}
}
// 변환된 단어 출력
std::cout << word << std::endl;
return 0;
}
그리고 라이브러리를 쓰는 경우에는 islower, isupper라는 함수가 있다.
toupper, tolower, islower, isupper 모두 cctype이라는 라이브러리에 포함되어있다. 명시해주지 않아도 사용이 되는 것으로 보아 iostream에 종속적인 헤더인것 같다.
내 코드의 개선할 점: 위에서 얻은 인사이트를 바탕으로 다른 문제에 적용시킬 수 있을 것 같다.
알고리즘 분류: 구현, 문자열
난이도: 브론즈 V
복습하면서 참고해본 블로그 목록:
toupper, tolower를 이 블로그를 보고 알게되었다.
'백준' 카테고리의 다른 글
[백준] 10809번 - 알파벳 찾기 (0) | 2024.03.20 |
---|---|
[백준] 11718번 - 그대로 출력하기 (0) | 2024.03.20 |
[백준] 2738번 - 행렬 덧셈 (0) | 2024.03.18 |
[백준] 2475번 - 검증수 (0) | 2024.03.18 |
[백준] 15964번 - 이상한 기호 (0) | 2024.03.18 |