본문 바로가기
코테준비/하루한개도전~

99클럽 코테 스터디 4일차 TIL : JadenCase 문자열 만들기

by 움바둠바 2024. 7. 25.
728x90

흐음 오늘 문제는 간단했는데.. 괜히 혼자 삽질을 했다.

https://school.programmers.co.kr/learn/courses/30/lessons/12951

 

프로그래머스

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

programmers.co.kr

모든 단어의 첫글자는 대문자, 나머지는 소문자로 변경해주면 되었다.


[첫번째 접근] sstream을 이용하자!

string을 스페이스 단위로 split해줄 수 있으므로, 처음에는 이걸 이용했다.

단어단위로 잘라오고, 조건에 맞게 변경해주었다.

이 때 대소문자 변경은, 아스키코드를 이용해주었다 (소문자 -> 대문자 : -32 해주기, 대문자 -> 소문자 : +32 해주기)

 

결과는... 실패였다!

문제점은 띄어쓰기였다.

내가 사용한 방법은 띄어쓰기를 전부 날려버려서, 매 단어마다 내가 임의로 띄어쓰기를 한 개 추가해주었다.

하지만 이렇게 되면 중간에 띄어쓰기가 여러번 나올때, 정답과 다른 결과를 낼 수 있었다!


[두번째 접근] 그냥 반복 돌리기

그래서 그냥 s문자열을 냅다 반복을 돌렸다.

일단 앞 문자열이 스페이스였는지를 확인하고, 스페이스였으면 대문자로 변경해준다.

아니면 소문자로 만들어서 그대로 냅둔다.

흠... 간단하게 풀었으면 금방 풀렸을것을...에잉

#include <string>
#include <vector>
#include <sstream>

using namespace std;

string solution(string s) {
    string answer;
    
    bool is_space = true;
    char temp;
    
    for(int i = 0; i<s.size(); i++){
        if(s[i] == ' '){
            is_space = true;
            answer.push_back(s[i]);
            continue;
        }
        if(is_space){
            if(!isdigit(s[i])){
                if(s[i] >= 97 && s[i] <= 122){
                    // 대문자로 바꾸기
                    s[i] -= 32;
                }
            }
        }else{
            if(s[i] >= 65 && s[i] <= 90){
                // 소문자로 바꾸기
                s[i] += 32;
            }
        }
        is_space = false;
        answer.push_back(s[i]);
    }
    
    
    
    return answer;
}
728x90