https://school.programmers.co.kr/learn/courses/30/lessons/120863#
#include <string>
#include <vector>
//'0' 의 값은 48, '1'의 값은 49, '9'의 값은 57
using namespace std;
string solution(string str) {
string answer = "";
int len=str.length();
int tmp=0;
int tx=0;
int tc=0;
//결국, 숫자야? x야? ' '(공백) 이야?, '+'야? 라는 네가지가 있고, +의 경우 무시해도 되고, 맨 마지막은 공백이 없다.
for(int i=0; i<len; i++){
if(str[i]>='0'&& str[i]<='9'){
tmp*=10;
tmp+=str[i]-'0'; //tmp값에 수를 저장.
}
else if(str[i]=='x'){
if(i!=0 && str[i-1]!=' '){
tx+=tmp;
tmp=0;
}
if(i!=0 && str[i-1]==' ') tx++;
if(i==0) tx++;
}
else if(str[i]==' '){
tc+=tmp;
tmp=0;
}
}
if(tmp!=0){
tc+=tmp;
tmp=0;
}
if(tx!=0){
if(tx!=1)
answer+=to_string(tx);
answer+='x';
}
if(tx!=0 && tc!=0) answer+=" + ";
if(tc!=0){
answer+=to_string(tc);
}
return answer;
}
분명 더욱 간단하게 푸는 방법이 있을것이고, 사용할만한 함수가 있을것 같다는 생각이 들었는데, 그리고 stringstream을 사용하는 풀이가 가능할 수 있겠다는 생각도 들고, 특히나 그 char이 넘버인지 아닌지에 대한 판단을 해주는 함수가 있었던걸로 기억한는데 그게 기억이 안나서 위의 경우처럼 각각의 char에 대한 판단을 하는 형태의 코드를 작성해서 제출하였다.
이때에 위의 코드에서
if(tx!=0){
if(tx!=1)
answer+=to_string(tx);
answer+='x';
}
위와 같은 부분에서,
if(tx!=1)
answer+=to_string(tx);
의 코드가 없이 작성을 해서 제출했는데, 계속해서 통과하지 못하는 경우가 발생해서 그 경우가 무엇인지 제대로 파악하지 못해서 거의 이 문제의 경우는 이 문제를 해결하기 위해서 하루종일 생각하고 도대체 내가 어디서 잘못한것인지, 반례가 무엇인지 찾아내기 위해서 시간을 들였다. 이런 문제에서 그만큼 시간을 들이는것이 현재 상황에서 그렇게 좋은 학습 방법은 아닐 수 있으나, 너무너무 풀고싶어서 정말정말 오래시간을 들여서 드디어 내가 무엇을 잘못 작성해서 모든 케이스들에 부합하는 프로그램을 작성하지 못했는지 파악하고 해당 코드를 첨부해서 통과할 수 있었다.
Lv 0. 에 해당하는 알고리즘 문제였는데, 풀고나니 속이 후련하고 뿌듯하다. 정말 너무 풀고싶어서 정말 오래도록 붙잡고 있었다.
다른 사람의 풀이들을 보니까 상위에 올라와있는 풀이들은, 대부분 stringstream을 사용하는 풀이들인데, 이런 풀이들 중에서도 내가 보기에 가장 중요한 것은, 이 풀이들도 결국에는 x의 계수가 최종 1인 경우를 분기를 시켜서 표현해주어야 한다는 것이다.
stringstream을 사용하는 풀이를 첨부해보면,
#include <string>
#include <sstream>
using namespace std;
string solution(string p) {
stringstream ss(p);
string temp;
int xsum = 0, nsum = 0;
while (getline(ss, temp, ' ')) {
if (temp.back() == 'x') {
if (temp.size() == 1) xsum++;
else xsum += stoi(string(temp.begin(), temp.end() - 1));
}
else if(temp!="+") nsum += stoi(temp);
}
if (xsum == 0) return to_string(nsum);
else {
string xres;
if (xsum == 1) xres = "x";
else xres = to_string(xsum) + "x";
if (nsum == 0) return xres;
else return xres + " + " + to_string(nsum);
}
}
이와 같은데, 이렇게 풀어도 결국에 맨 마지막에 if(xsum==1) xres="x"; 형태처럼 꼭 계수가 1인 경우를 따로 처리해주어야 한다.
그리고 문제에서 내가 처음에, 해당 char가 숫자인지 아닌지에 대해서 판단해주는 함수에 대해서 떠올렸었는데, 그 함수를 한번 찾아서 첨부해보면,
C++에서 문자(char)가 숫자인지 판단하려면 `isdigit` 함수를 사용할 수 있습니다. 이 함수는 문자가 0부터 9까지의 숫자 중 하나인 경우에 `true`를 반환하고, 그렇지 않은 경우에 `false`를 반환합니다. `isdigit` 함수를 사용하려면 `<cctype>` 헤더를 포함해야 합니다.
다음은 `isdigit` 함수의 사용 예제입니다:
```cpp
#include <iostream>
#include <cctype>
int main() {
char ch = '5';
if (isdigit(ch)) {
std::cout << ch << "는 숫자입니다." << std::endl;
} else {
std::cout << ch << "는 숫자가 아닙니다." << std::endl;
}
return 0;
}
```
위 코드에서 `isdigit(ch)`는 문자 `ch`가 숫자인지 여부를 판단하고 그 결과를 출력합니다. 위 예제는 `'5'`가 숫자이므로 "5는 숫자입니다."를 출력합니다.
따라서 `isdigit` 함수를 사용하여 문자가 숫자인지 아닌지를 쉽게 판단할 수 있습니다.
위와 같은 정보를 얻을 수 있다.
내가 처음에 떠올린 함수는 결국 Isdigit() 함수이고, 해당 함수를 사용하려면 <cctype> 헤더를 첨부해야한다. <cctype> 헤더에 대해서는 아직 생소해서, 이 헤더를 바로 떠올리기 보다는 <bits/stdc++.h> 형태로 첨부할 가능성이 높긴 한데, <cctype> 을 기억해보도록 하자.
<cctype> 헤더에 대해서 검색해보고 정보를 첨부한다.
`<cctype>` 헤더는 C++ 프로그래밍에서 문자(character)와 문자열(string)을 다룰 때 유용한 문자 관련 함수 및 매크로들을 제공하는 표준 라이브러리 헤더입니다. 이 헤더에 정의된 함수들은 주로 문자의 속성을 검사하거나 변환하는 데 사용됩니다.
일반적으로 `<cctype>` 헤더에 포함된 함수와 매크로는 다음과 같은 몇 가지 기능을 수행합니다:
1. **문자 검사 함수**:
- `isalpha(int c)`: 주어진 문자 `c`가 알파벳 문자인지 여부를 확인합니다.
- `isdigit(int c)`: 주어진 문자 `c`가 숫자 문자인지 여부를 확인합니다.
- `isalnum(int c)`: 주어진 문자 `c`가 알파벳 문자 또는 숫자 문자인지 여부를 확인합니다.
- `islower(int c)`: 주어진 문자 `c`가 소문자인지 여부를 확인합니다.
- `isupper(int c)`: 주어진 문자 `c`가 대문자인지 여부를 확인합니다.
- 등등...
2. **문자 변환 함수**:
- `tolower(int c)`: 주어진 대문자 문자 `c`를 소문자로 변환합니다.
- `toupper(int c)`: 주어진 소문자 문자 `c`를 대문자로 변환합니다.
3. **문자 매크로**:
- `EOF`: 파일의 끝(End Of File)을 나타내는 매크로입니다. `EOF`는 정수 상수로 `-1`로 정의되어 있습니다.
`<cctype>` 헤더의 함수와 매크로들은 문자열 처리, 입력 검증, 문자열 변환 등 다양한 상황에서 유용하게 사용됩니다. 이 헤더를 포함하면 문자 관련 작업을 쉽게 수행할 수 있으며, 문자열의 속성을 식별하거나 조작하는 데 도움이 됩니다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Lv 0. 안전지대 (0) | 2023.10.06 |
---|---|
Lv 0. 숨어있는 숫자의 덧셈 (2) (0) | 2023.10.06 |
Lv 0. 최댓값 만들기 (2). *다시 풀어보기* - 더 간결하게 (0) | 2023.10.03 |
Lv 0. 캐릭터의 좌표 (0) | 2023.10.03 |
Lv 0. 직사각형 넓이 구하기. (0) | 2023.10.03 |