Make Unreal REAL.
article thumbnail
Level 1. 문자열 나누기

 

 

처음에 문제의 조건을 x가 아닌 다른 글자들이 아니라 x가 아닌 다른 글자들 중으로 잘못 이해하여 정답률이 31%가 나왔다.

 

// 이 코드는 틀린 풀이이다.
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <climits>

using namespace std;

int solution(string s)
{
    int answer = 0;
    unordered_map<char, int> umap;

    for (int i = 0; i < s.length(); ++i)
    {
        ++umap[s[i]];

        int minCount = INT_MAX;
        
        for (pair<char, int> pr : umap)
        {
            if (pr.second == minCount)
            {
                s = s.substr(i + 1);
                ++answer;
                umap.clear();
                i = -1;

                break;
            }
            else
            {
                minCount = min(minCount, pr.second);
            }
        }
    }

    return answer + !!s.length();
}

 

질문하기 페이지에서 조건을 잘못 이해한 것을 깨닫고 각 문자의 개수가 아니라 나머지 문자들의 총 개수로 비교하여 해결했다.

 

풀고 나서 생각해보니 굳이 string.substr() 함수로 문자열을 나눌 필요도 없었다.

 

#include <iostream>
#include <unordered_map>

using namespace std;

int solution(string s)
{
    int answer = 0;
    int sum = 0;
    size_t length = s.length();
    unordered_map<char, int> umap;

    for (int i = 0; i < length; ++i)
    {
        ++sum;
        ++umap[s[i]];

        for (pair<char, int> pr : umap)
        {
            if (pr.second == sum - pr.second)
            {
                ++answer;
                sum = 0;
                umap.clear();

                break;
            }
        }
    }

    return answer + !!sum;
}

 

아래는 다른 사람의 풀이인데, 개수를 map에 저장하지 않고 이중 for문을 돌면서 모든 경우의 수를 계산하는 방법이다.

 

내 방법은 map에 존재하는 문자에 대해서만 확인하는 반면, 다른 사람의 방법은 i부터 이후의 모든 문자를 확인한다.

 

반복 횟수가 적어서 내 풀이가 더 빠를 줄 알았는데 아무래도 map 컨테이너를 사용해서 그런지 다른 사람의 풀이가 훨씬 빨랐다.

 

#include <iostream>

using namespace std;

int solution(string s)
{
    int answer = 0;
    int count = 0, otherCount = 0;
    int i, j;
    size_t length = s.length();
    
    for (i = 0; i < length; ++i)
    {
        for (j = i; j < length; ++j)
        {
            (s[j] == s[i]) ? ++count : ++otherCount;

            if (count == otherCount)
            {
                count = otherCount = 0;
                i = j;
                ++answer;

                break;
            }
        }
    }

    return answer + (i == j);
}

'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 1. [1차] 다트 게임  (0) 2023.03.02
Level 1. 체육복  (0) 2023.03.01
Level 1. 기사단원의 무기  (0) 2023.02.25
Level 1. 대충 만든 자판  (0) 2023.02.24
Level 1. 실패율  (0) 2023.02.23
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그