알고리즘/프로그래머스 1단계

프로그래머스 - 컨트롤 제드 - C++

게임만드는학생 2023. 8. 14. 14:50

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    int before = 0;

    for (int i = 0; i < s.length();)
    {
        string t = "";
        while (i < s.length() && s[i] != ' ')
        {
            t += s[i];
            i++;
        }
        if (t == "Z")answer -= before;
        else
        {
            int n = stoi(t);
            answer += n;
            before = n;
        }
        i++;
    }

    return answer;
}

 

설명

공백으로 구분된 문자열을 읽으며 숫자, 공백, Z 에 따라 특정 행동을 하면 된다.

먼저 i for문으로 문자열의 길이까지만 읽도록 한다. 

 

while (i < s.length() && s[i] != ' ')
        {
            t += s[i];
            i++;
        }

그리고 그 안쪽에 첫 번째 while 문으로 공백 이전까지의 문자열을 t에 저장한다. 

숫자면 "1234" 이런식으로 Z 면 "Z" 로 t에 저장된다. 

 

i for문 즉, 가장 바깥 for문에서 마지막에 i++ 을 안해줬다. 따라서 while 문에서 공백이 나올때까지 i++을 해줘야 다음 인덱스를 확인할 수 있다.

 

if (t == "Z")answer -= before;
else
{
      int n = stoi(t);
      answer += n;
      before = n;
}

그리고 그 값이 Z 면 바로 이전 숫자였던 값을 answer에서 빼준다.

바로 이전 값은 before 변수에 저장해놓는다. 

 

Z가 아니면 숫자라는 얘기이므로 문자열을 숫자로 바꿔주는 stoi() 를 사용한다. 

그리고 그 값을 before에 저장한다. 그래야 다음번에 Z 가 나오면 컨트롤 제트할 수 있기 때문이다.

 

마지막에 i++ 을 한 번 하는 이유는 while문에서 공백이 나왔을 때 i는 공백 인덱스를 가리키고 있다.

따라서 1을 증가시켜 그 다음 문자열부터 확인하기 위함이다.