dobarz

adatak 

 

두 개의 문자열이 입력되었다고 치자.

이 때, 각 열을 준으로 문자열을 새로 만들게 되면, "da", "od", "ba", "at", "ra", "zk" 총 6개의 문자열이 만들어진다.

첫 번째 행의 문자열을 제거한 뒤, 동일한 방법으로 문자열을 만들게 되면, "a", "d", "a", "t", "a", "k" 총 6개의 문자열이 만들어진다.

 

처음에 만들었던 "da", "od", "ba", "at", "ra", "zk" 간에는 중복이 존재하지 않는다.

두 번째로 만든  "a", "d", "a", "t", "a", "k" 에는 "a"가 총 3번 중복되고 있다. 

 

즉, 기존의 문자열을 1개 제거했더니 열 문자열에서 중복되는 문자열이 발생한 것이다.

 

이처럼, 입력으로 주어진 문자열에서 몇 개를 지우면 열 문자열에서 중복되는 문자열이 발생하는지를 구하면 된다.

위의 예시에선 1을 답으로 출력하면 된다.

 

문제 풀이

아주 단순하게 접근하였다.

 

주어진 문자열을 기반으로 열 문자열을 만들어서 자료구조에 저장한 뒤, 맨 앞의 문자를 하나씩 지워가며 중복 검사를 진행한 것이다.

 

하지만, 문자열의 경우 맨 앞의 문자를 제거하면 뒤의 모든 문자를 앞으로 땡겨오는 연산을 해야하는 문제가 있다.

그러므로, 열 문자열을 저장할 때 앞뒤를 뒤집은 상태로 저장하고 맨 뒤의 문자를 제거하면서 중복 검사를 하였다.

 

중복검사는 unordered_set을 이용해서 하였다. unordered_set에 모든 문자열을 삽입한 뒤, 문자의 개수와 unordered_set의 size가 동일한지를 테스트하여 중복 여부를 검사하였다.

 

풀이 코드

int StrSize = 0;
int VecSize = 0;
std::cin >> StrSize >> VecSize;

std::vector<std::string> Vec(VecSize, std::string(StrSize, '0'));
for (int i = 0; i < StrSize; i++)
{
    for (int j = 0; j < VecSize; j++)
    {
        std::cin >> Vec[j][StrSize - 1 - i];
    }
}

 

벡터에 열 문자열을 모두 저장해주고 있다.

앞에서 말했던 것처럼, 열 문자열을 저장할 때 뒤집어서 저장을 해주고 있다.

 

int Count = 0;

for(int j = 0; j < StrSize; j++)
{
    for (int i = 0; i < VecSize; i++)
    {
        Vec[i].pop_back();
    }

    std::unordered_set<std::string> Strs;

    for (int i = 0; i < VecSize; i++)
    {
        Strs.insert(Vec[i]);
    }

    if (Strs.size() == VecSize)
    {
        Count++;
    }
    else
    {
        break;
    }
}

 

이후, 모든 문자열의 가장 마지막 원소(실제로는 열 문자열의 가장 앞 문자)를 제거해주었다.

그리고 unordered_set에 모든 문자열을 삽입하였고, unordered_set의 size와 기존 문자열의 개수와 동일한지를 검사하여 Count를 증가시키거나 반복문을 탈출하도록 분기를 두었다.

 

std::cout << Count;

return 0;

 

반복문이 끝나고 Count를 출력하면 끝이다.

 

코드 전문

더보기
#include <iostream>
#include <vector>
#include <unordered_set>

void Init()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
}

int main()
{
    Init();

    int StrSize = 0;
    int VecSize = 0;
    std::cin >> StrSize >> VecSize;

    std::vector<std::string> Vec(VecSize, std::string(StrSize, '0'));
    for (int i = 0; i < StrSize; i++)
    {
        for (int j = 0; j < VecSize; j++)
        {
            std::cin >> Vec[j][StrSize - 1 - i];
        }
    }

    int Count = 0;
    
    for(int j = 0; j < StrSize; j++)
    {
        for (int i = 0; i < VecSize; i++)
        {
            Vec[i].pop_back();
        }

        std::unordered_set<std::string> Strs;

        for (int i = 0; i < VecSize; i++)
        {
            Strs.insert(Vec[i]);
        }

        if (Strs.size() == VecSize)
        {
            Count++;
        }
        else
        {
            break;
        }
    }

    std::cout << Count;

    return 0;
}

'코딩테스트 문제 풀이 (C++)' 카테고리의 다른 글

백준 2436 - 공약수 (C++)  (0) 2024.05.21
백준 16678 - 모독 (C++)  (0) 2024.05.19
백준 2665 - 미로만들기 (C++)  (0) 2024.05.17
백준 20207 - 달력 (C++)  (0) 2024.05.17
백준 5397 - 키로거 (C++)  (0) 2024.05.16

+ Recent posts