[C++] 프로그래머스 COS Pro 1급 메모장
2021. 8. 28.
반응형

https://programmers.co.kr/learn/courses/11114/lessons/70748

 

COS Pro 1급 C++ 모의고사 - 메모장

한 줄에 K자를 적을 수 있는 메모장에 영어 단어들을 적으려 합니다. 영어 단어는 정해진 순서로 적어야 하며, 단어와 단어 사이는 공백 하나로 구분합니다. 단, 한 줄의 끝에 단어 하나를 완전히

programmers.co.kr

 

1. 서론

 

쉽게 봤는데 푸는데 49분이나 걸림 에바 ㅋ 이게 종이랑 펜으로 구상하고 풀 수 있으면 엣지 케이스 때문에 이렇게 시간낭비 안 했을 텐데 맨머리로만 풀려니까 코드를 짜 놓고도 감이 안 와서 구현을 제대로 못함 ㅎ

 

2. 문제 풀이

 

문자열 배열이 주어진다. 그 문자열들을 메모장에 적어야 하는데 규칙이 있다.

문자열 순서를 바꾸면 안되고 주어진 대로 써야 하며, 메모장에 단어를 적을 때 단어들 간의 공백이 한 칸 있어야 한다.

그리고 메모장에 한 줄에 몇 글자를 적을 수 있는지가 주어지는데 이 범위를 넘어가면 다음 줄에다가 적어야 한다.

이렇게 단어를 다 적었을 때 메모장에 몇 줄이 나오는지 구하는 문제이다.

 

역시나 처음 봤을 때 되게 간단해 보였다. (실제로도 푸는 논리 자체는 간단, 근데 조건을 여러 가지 걸어야 함)

첫 번째 단어의 길이 + 공백 해서 변수에 값을 저장해 둔다.

그리고 다음 단어의 길이를 더해보고 범위를 넘어가면 count 해서 다음줄로 넘겨서 단어를 처리하는 방식이다.

 

여기서 주의할 점(이것 때문에 시간날림)

나는 그 더한 값들이 범위보다 같거나 더 클 때 count를 해줬다.

즉, 그렇지 않은 경우에 단어들을 다 적게 되면 그대로 끝나는데 이 경우 마지막 줄이 count가 안된다.

그래서 반복문을 빠져나와서 count를 한 번 더 해줬는데 틀리는 테스트 케이스가 발생했다.

이것 때문에 뭔지도 몰라서 나름대로 이것저것 시도해 본 결과 알게 되었다.

바로 단어의 길이를 더한 값과 범위가 같은 상태에서 끝난 경우. 이 경우는 이미 count 되어 있는데 나와서 또 count가 되기 때문에 틀리게 나왔던 것이다. 그래서 이미 count가 되었다면 반복문 밖에서 count 되지 않도록 처리해 주었다.

 

근데 테스트 케이스가 범위보다 큰 경우에서 끝나는 경우가 없어서 그런지 아니면 문제 구조상 그래도 상관없는지 몰라도 그 케이스만 아니면 그냥 반복문 나와서 count 한 번 더 해주면 다 맞더라... 풀고도 약간 얼떨떨하다. 

 

3. 코드 설명

 

// 다음과 같이 include를 사용할 수 있습니다.
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int solution(int K, vector<string> words) {
    // 여기에 코드를 작성해주세요.
    int i, cnt = 0, f, sum = words[0].size() + 1;
    
    for (i = 1; i < words.size(); i++)
    {
        sum += words[i].size(), f = 0;
        if (sum > K)
        {
            cnt++;
            sum = words[i].size() + 1;
        }
        else if (sum == K)
        {
            cnt++;
            sum = 0, f = 1;
        }
        else
            sum++;   
    }
    
    if (f != 1)
        cnt++;
    
    return cnt;
}

// 아래는 테스트케이스 출력을 해보기 위한 main 함수입니다.
int main() {
    int K = 10;
    vector<string> words = {"nice", "happy", "hello", "world", "hi"};
    int ret = solution(K, words);

    // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    cout << "solution 함수의 반환 값은 " << ret << " 입니다.";
}

 

sum에 첫 번째 단어의 길이와 공백 문자를 대신해 +1을 저장해준다.

그리고 반복문을 돌리며 단어들을 더해준다. 그 후 길이가 범위를 벗어나면 다음 줄로 넘기고 sum값에 해당 단어 값과 공백 값을 세팅해준다.

만약 범위와 sum값이 같은 경우에는 그 단어는 이미 적은 것이기 때문에 sum값을 0으로 비워주고 다음 줄로 넘기도록 cnt를 올려준다.

f는 위에서 적은 것처럼 이 케이스에서 끝나는 경우 두 번 cnt하지 않기 위한 flag이다.

그리고 그 이외의 경우에는 그냥 sum값에 단어를 적은 것이 되기 때문에 공백 문자를 대신해서 +1을 해주고 다음 단어로 넘어간다.

그리고 반복문이 끝나면 마지막으로 값을 적었던 문장까지 포함해서 +1을 해주고 값을 return 한다.

 

 

 

 

반응형
myoskin