https://school.programmers.co.kr/learn/courses/30/lessons/120864
#include <string>
#include <vector>
#include <cctype>
//isdigit() 함수 사용하기 위해 cctype 헤더 포함
using namespace std;
int solution(string str) {
int answer = 0;
int tmp=0;
for(auto c: str){
if(isdigit(c)) {
tmp*=10;
tmp+=c-'0';
}else{
if(tmp!=0){
answer+=tmp;
tmp=0;
}
}
}
if(tmp!=0) answer+=tmp;
return answer;
}
위의 코드의 경우 내가 제출한 코드이고, 이런 형태의 코드를 작성할때 주의할 점은, 위의 코드의 경우 수를 더할때 수가 아닌 다른 char를 만나면 수를 더하는 판단을 하게 되는 형태로 작성했다는 것이다. 그렇기 때문에, 만약 주어지는 스트링의 맨 마지막이 수로 끝나는 형태이면, 이 경우는 그 다음에 판단을 진행해줄 수가 아닌 형태의 char를 만나지 않기 때문에, 맨 마지막에 tmp에 담긴 값을 따로 더해주는 연산을 추가적으로 진행시켜 주어야 한다는 것이다. 그 부분이 바로
if(tmp!=0) answer+=tmp;
에 해당한다.
주어진 예제 케이스의 경우 맨 마지막에 수로 끝나는 경우가 아니다 보니까, 예제만 통과하게 되면 정답인줄 알고 제출하고 넘어가게 될 수 있는데, 그렇게 되는 경우 프로그램을 잘못 작성하게 되는것이 된다. 판단 기준에 대해서 방향을 잡았다면, 그 판단이 불가능한 경우에 대한 판단도 확실하게 하고 처음부터 그걸 고려해서 프로그램을 작성해야한다.
그리고 다른 사람의 풀이를 통해서 접하게 된 형태의 코드가 있는데, 아주 재미있고 간결한 풀이여서 한번 첨부해보자면,
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int solution(string my_string) {
int answer = 0;
for(auto& v : my_string)
{
if(!isdigit(v))
{
v = ' ';
}
}
stringstream ss;
ss.str(my_string);
int tmp = 0;
while(ss)
{
answer += tmp;
ss >> tmp;
}
return answer;
}
위와 같이 isdigit()함수를 이용해서, digit이 아니라면, 해당 문자를 v=' '; 을 이용해서 공백문자로 변경시키고,
그리고 난뒤에 stringstream ss; 을 선언하고, ss 에 수가 아닌경우 공백으로 변경되어 있는 my_string 을 할당한뒤에,
int tmp로 stringstream에서 정수들을 뽑아내서 answer에 더해주는 형태의 프로그램인데, 아주아주 멋진 형태의 프로그램이라는 생각이 든다. 다음에는 위와 같은 형태로 한번 생각을 해보도록 하자.
추가적으로, 위의 코드를 내 식대로 한번 변경해서 첨부해보면,
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int solution(string my_string) {
int answer = 0;
for(auto& v : my_string){
if(!isdigit(v)){
v = ' ';
}
}
stringstream ss(my_string);
int tmp = 0;
while(ss){
answer += tmp;
ss >> tmp;
}
return answer;
}
위와 같이 나타낼 수 있을 것이고,
이때에 stringstream ss(my_string); 이라고 한번에 선언과 할당을 하는 부분,
그리고 while(ss) 형태로 stringstream에서 while 문을 돌리는 형태를 이해하고 기억한다면, 위와 같은 형태의 코드를 작성할때 쉽고 편하게 작성할 수 있을 것이다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Lv 0. 삼각형의 완성조건 (2) (0) | 2023.10.06 |
---|---|
Lv 0. 안전지대 (0) | 2023.10.06 |
Lv 0. 다항식 더하기 *다시 풀어보기* (0) | 2023.10.06 |
Lv 0. 최댓값 만들기 (2). *다시 풀어보기* - 더 간결하게 (0) | 2023.10.03 |
Lv 0. 캐릭터의 좌표 (0) | 2023.10.03 |