[C++] 99클럽 코테 스터디 13일차 TIL + JadenCase 문자열 만들기(프로그래머스 12951번)

2025. 4. 16. 21:01·항해99 코테

✅ 오늘의 학습 키워드

  • 문자열
  • 대소문자 변환 함수 - toupper, tolower
  • Flag 변수 활용

✅ 공부한 내용

✔️ 문제 요약

(프로그래머스 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12951)

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열이다.
(단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 된다.)

제한 조건:

  • 문자열 길이 1~200
  • 알파벳, 숫자, 공백문자로 구성
  • 숫자는 단어의 첫 문자로만 가능
  • 숫자로만 이루어진 단어는 없음
  • 공백문자가 연속해서 나올 수 있음

입출력 예:

  • "3people unFollowed me" → "3people Unfollowed Me"
  • "for the last week" → "For The Last Week"

✔️ 풀이 로직

이 문제는 단어별로 첫 문자와 나머지 문자를 구분하여 대소문자 변환을 적용해야 한다. 핵심 로직은 다음과 같다:

  1. 단어의 시작을 표시하는 Boolean 변수(startWord)를 사용 -> 이게 제일 중요하지 않을까 싶다.
  2. 문자열을 순회하며 현재 문자를 확인:
    • 현재 문자가 공백일 경우 → 다음 문자는 단어의 시작으로 설정
    • 현재 문자가 단어의 시작 문자라면 → 대문자로 변환 후 시작 설정 해제
    • 현재 문자가 단어의 시작 문자가 아니라면 → 소문자로 변환

✅ 오늘의 회고

- 😳 어떤 문제가 있었고, 나는 어떤 시도를 했는지

처음에는 '단어의 시작'을 어떻게 알려줘야할지 고민이었다. 첫 문자만 분리해서 단어를 대문자를 변환해 줘서 나머지 문자와 합쳐야 하나 생각을 했다. 하지만 접근 방식을 바꿔서 평범하게 문자열을 하나씩 순회해서 상태를 추척하는 방법으로 시도했다. 여기서 핵심은 '단어의 시작'이라는 상태를 관리하는 것이었다.

- 🤔 어떻게 해결했는지

그렇게 '단어의 시작'의 상태를 관리하기 위해 다음과 같이 'startWord'라는 Flag 변수를 설정해서 푸는 것으로 결정했다.

  bool startWord = true;

처음 문자가 공백일 경우도 있다. 그렇기에 공백을 만나면 startWord = true 로 설정하여 다음 문자가 단어의 시작임을 표시해 준다.

단어의 첫 글자를 처리한 후에는 startWord = false로 설정하여 이후 글자들은 단어 내부 글자라는 것을 표시해 준다.

그렇게 단어들을 소문자를 대문자로 변환하는 함수(toupper)와 대문자를 소문자로 변환하는 함수(tolower)를 사용하여 문자열들을 처리해 주었다.

- 🤩 무엇을 새롭게 알았는지

  • Flag 변수 사용: 문자열을 처리할 때 현재 위치가 어떤 상태인지 추적하는 것이 중요하다. 이 문제에서는 '단어의 시작' 상태를 추적함으로써 문제를 간단하게 해결할 수 있었다.
  • toupper와 tolower 함수의 활용: C++의 toupper()와 tolower() 함수는 문자열 대소문자 변환에 유용하다. 찾아보다가 알게 된 것은 toupper나 tolower는 숫자, 특수문자, 공백 등의 문자에 함수를 적용해도 원래 문자가 그대로 유지된다고 한다. 즉, 알파벳인 경우에만 적용이 된다고 보면 이해가 쉽다.
  • 예를 들어, tolower 함수를 사용한다고 하자.
    • tolower('A') -> 'a'를 반환
    • tolower('5') -> '5'를 그대로 반환
    • tolower('!') -> '!'를 그대로 반환
    • tolower(' ') -> ' '(공백)을 그대로 반환

✅ 전체 코드

#include <string>
#include <vector>

using namespace std;

string solution(string s) {

    bool startWord = true;

    for (int i = 0; i < s.length(); i++){
        if (s[i] == ' '){ // 현재 문자가 공백일 경우
            startWord = true;  // 다음 문자가 단어의 시작이 될 수 있기 때문에 true로 설정
        }
        else { 
            if(startWord){ // 현재 문자가 단어의 시작이라면
                s[i] = toupper(s[i]); // 현재 문자를 대문자로 변환
                startWord = false; // 다음 문자는 시작이 아니기 때문에 false
            }
            else { // 단어의 시작이 아니라면 
                s[i] = tolower(s[i]); // 현재 문자를 소문자로 변환
            }
        }

    }

    return s;
}

'항해99 코테' 카테고리의 다른 글

[C++] 99클럽 코테 스터디 15일차 TIL + 리그 오브 레전설 (Small) (백준 17271번)  (0) 2025.04.18
[C++] 99클럽 코테 스터디 14일차 TIL + 진우의 달 여행 (Small) (백준 17484번)  (1) 2025.04.17
[C++] 99클럽 코테 스터디 12일차 TIL + 포도주 시식(백준 2156번)  (0) 2025.04.15
[C++] 99클럽 코테 스터디 11일차 TIL + 과자 나눠주기(백준 16401번)  (0) 2025.04.14
[C++] 99클럽 코테 스터디 10일차 TIL + 병든 나이트(백준 1783번)  (0) 2025.04.11
'항해99 코테' 카테고리의 다른 글
  • [C++] 99클럽 코테 스터디 15일차 TIL + 리그 오브 레전설 (Small) (백준 17271번)
  • [C++] 99클럽 코테 스터디 14일차 TIL + 진우의 달 여행 (Small) (백준 17484번)
  • [C++] 99클럽 코테 스터디 12일차 TIL + 포도주 시식(백준 2156번)
  • [C++] 99클럽 코테 스터디 11일차 TIL + 과자 나눠주기(백준 16401번)
탱도시락
탱도시락
  • 탱도시락
    코딩도시락
    탱도시락
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • CS50 (4)
      • 항해99 코테 (17)
      • C++ 코딩테스트 준비 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트 합격자 되기
    코딩테스트준비
    데이터 타입
    2진법
    James Cameron
    코칭스터디 2기
    코딩테스트 문법
    디지털윤리
    CS50 코칭스터디 2기
    창작과모방
    컴퓨팅 사고력
    CS50
    99클럽
    유니코드
    시간복잡도
    코딩테스트
    2진수
    컴퓨터과학
    항해99
    개발자취업
    인간도 모델이다
    아스키코드
    Vector
    C++
    부스트코스
    배열의 효율성
    알고리즘 효율 분석
    Til
    코테
    2차원 배열
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
탱도시락
[C++] 99클럽 코테 스터디 13일차 TIL + JadenCase 문자열 만들기(프로그래머스 12951번)
상단으로

티스토리툴바