Notice
Recent Posts
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
관리 메뉴

이우의 개발일지

[C++] 백준 1316번 그룹 단어 체커 본문

Coding

[C++] 백준 1316번 그룹 단어 체커

공대이우 2024. 5. 10. 22:45

문제 1316

https://www.acmicpc.net/problem/1316

 

 

문제 코드 

#include<iostream>
using namespace std;

#include<string>

int main()
{
    int num, cnt = 0;
    cin >> num;

    for (int i = 0; i < num; i++)
    {
        string str;
        cin >> str;
        int check = 0;

        for (int j = 0; j < str.length() - 1; j++)
        {
            if (str[j] != str[j + 1] && str.substr(j + 1).find(str[j]) != std::string::npos)
            {
                check = 1;
                break;
            }
        }

        if (check == 0) cnt += 1;
    }

    cout << cnt << endl;
    return 0;
}

 

구현 문제 중 그룹단어체커는 어려운 문제는 아니다.

다만 연속된 단어 이외에 aba 처럼 연속되지 않은 단어가 중복되서 나오는 것을 체크하는 것이 중요하다.

 

 if (str[j] != str[j + 1] && str.substr(j + 1).find(str[j]) != std::string::npos)
 {
     check = 1;
     break;
 }

 

이 부분이 메인인데, str[j]와 str[j+1]이 연속되지 않으면서, 똑같은 문자가 나온다면 이건 카운트 할 수 없다.

라는 코드이다.

여기서 substr(j+1)은 str의 j+1부터 끝까지 추출해서 find(str[j]), 즉 str[j]와 같은 걸 찾겠단 말입니다. 

std::string::npos는 C++ 표준 라이브러리에서 std::string::find() 함수가 특정 문자열 또는 문자를 찾지 못했을 때 반환하는 정적 상수이다.

같은 것을 못찾았을 때 카운드 한다는 말이다.

 

이렇게 위처럼 풀면 간단하게 풀 수 있다. 

 


나는 처음에 아래처럼 삼중 for문을 돌려서 일일히 체크할려했다,, 

생고생을 한 코딩.. ㅋㅋ 암튼 밑에도 정답이긴 하다. 

 

#include <iostream>
#include <vector>
#include<string>

using namespace std;
int main() {

   int Num;
   cin >> Num;
   int result = Num;
   vector<string> a;
   int flag = 0;
   int same = 0;
   for (int i = 0; i < Num; i++) {
      string ex;
      cin >> ex;
      a.push_back(ex);
      
   }
   for (int i = 0; i < Num; i++) {
      int* array = new int[a[i].size()];
      for (int j = 0; j < a[i].size(); j++) {
         array[j] = a[i][j];
         //cout << array[j] << endl;
      }
      for (int j = 0; j < a[i].size()-1; j++) {
         for (int k = 1; k < a[i].size(); k++) {
            if (array[j] == array[k]) {
               if (j == k - 1) continue;
               else if (array[k] == array[k - 1]) continue;
               else {
                  result--;
                  flag = 1;
                  break;
               }
            }
         }
         if (flag == 1) {
            flag = 0;
            break;
         }
      }
   
   }
   cout << result << endl;
   return 0;
}

반응형

'Coding' 카테고리의 다른 글

[백준/C++] 1193번 분수찾기 코딩  (0) 2024.05.15
[백준/C++] 2941번 크로아티아 알파벳  (0) 2024.05.15
[C++] 백준 10828번 스택  (0) 2024.05.10
[C/C++] map 함수 / STL 함수  (0) 2024.05.07
[C/C++] stringstream 사용법  (0) 2024.05.07