https://programmers.co.kr/learn/courses/11114/lessons/70748
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 한다.
'Algorithm' 카테고리의 다른 글
[C++] 프로그래머스 최소직사각형 (0) | 2022.03.17 |
---|---|
[C++] 프로그래머스 부족한 금액 계산하기 (0) | 2022.01.29 |
[C++] 프로그래머스 COS Pro 1급 숫자 뽑기 (0) | 2021.08.28 |
[C++] 프로그래머스 COS Pro 1급 꽃피우기 (0) | 2021.08.24 |
[C++] 백준 1260 DFS와 BFS (0) | 2021.08.22 |