[백준] 2866_문자열 잘라내기 C++


Set을 활용해보는 문자열 문제

정답제출코드


#include <iostream>
#include <string>
#include <set>

using namespace std;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    string arr[1001];
    string str[1001];
    int R, C;

    cin >> R >> C;

    for (int i = 0; i < R; ++i)
        cin >> arr[i];
    
    for (int i = 0; i < C; ++i)
    {
        string s = "";

        for (int j = 0; j < R; ++j)
            s += arr[j][i];
        
        str[i] = s;
    }

    int count = 0;
    for (int i = 0; i < R; ++i)
    {
        set<string> s;
        set<string>::iterator iter;
        for (int j = 0; j < C; ++j)
        {
            str[j].erase(str[j].begin());

            iter = s.find(str[j]);

            if (iter == s.end())
                s.insert(str[j]);
            else
            {
                cout << count;
                return 0;
            }
        }
        count++;
    }

    cout << R-1;

    return 0;
}

중복 여부를 따질만한 데는 set만한 자료구조가 없지.

입력을 받을 배열을 하나 만들어주고,

열 방향 문자열을 받을 배열 str을 하나 더 만들어 주었다.

그리고 행 하나씩 과정을 진행하였는데,

내가 했던 실수가 있다.

맨 위의 행을 지우고 나서 중복여부를 따져야하는데, 중복 여부를 따지고 나서 지우는 행위를 해서

값이 다르게 나오는 오류가 발생하였다.

이래서 문제를 잘 읽어야 한다.

중복 여부를 따질 때에는 set을 활용하였다.

str[j].erase(str[j].begin());

iter = s.find(str[j]);

if (iter == s.end())
    s.insert(str[j]);
else
{
    cout << count;
    return 0;
}

그리고 만일 행 하나가 남을 때 까지 중복이 없는 경우를 대비해서

count가 그래도 출력 될 수 있도록 맨 아래에 아래와 같은 코드를 넣어주었다.

cout << R-1;

즉, 예외처리인 것이다.

처음엔 쫄았지만 그래도 생각보단 무난하게 풀 수 있는 문제였다.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2