본문 바로가기
Programming/Algorithm

띄어있는 알파벳 파악하기

by OKOK 2018. 1. 25.

flag 를 두어서 끝나면 1로 설정하도록 하나요? 어떻게 하나요? 보세요

aa bb cc dd a  이렇게 받았다고 가정을 하빈다.


그럼 알파벳 어레이에서 숫자를 샌다고 가정을 합니다. 연속된 숫자를 기록한다음에 다시 a 를 확인합니다.

그런데 flag 가 1로 되어 있습니다. 그럼 이것은 연속된 알파벳이 아님을 감지합니다.

오케이 그럼 이 플래그를 1로 만들기 위해서는 어떻게 해야하나요? 

먼저 a 를 입력 받고 flag = 0 입니다. 아이와 아이+1 을 비교합니다. 그래서 다르면 i 의 flag 를 1로 처리합니다. 오케이요. 그럼 가장 마지막에 있는 d 의 경우는 어떻게 처리하나요? 예를 들어 aa bb cc dd 가 들어왔다고 가정을 합니다. 그럼 flag 의 경우 1 1 1 로 닫히고 마지막 d는 그다음 뒤와 비교를 해야하는데? 그 다음 인덱스가 존재하지 않습니다. 마지막인지 아닌지 체크를 하도록 합니다. 오케이 마지막인지 아닌지 체크하는 것도 하나 넣어주도록 합니다. 

a b c d e f

2 2 2 2

1 1 1 1


렝스 마지막의 것은 어떻게 체크를 할 것인지 생각을 해보도록 하겠습니다. 엄엄.... 마지막 것은 어떻게 처리를 해야하지??? 

 


/*

간던 곳인지만 체크하도록 합니다. 연속적으로 나온 것은 괜찮습니다.

이렇게 표시하도록 합니다.

일단 하나만 받아서 해보도로 하겠습니다.

aabbccdda 이것을 받아보도록 하겠습니다.


a  b  c  d

t  t  t  t


4개가 나오면 됩니다. true 갯수를 세면 됩니다.

그런데 aaaaabbccdd 이렇게 나오는 거랑 aabbccdd 랑 나오는 거랑 동일하니,

a 가 나오면 이것이 다른 숫자가 나올 때까지 다른 것들은 변합없이 인덱스만 올라가도록

합니다.


aaaa bb cc dd a


라고 가정을 해보도록 하겠습니다. 먼저

아이가 0 이고 아이 1과 동일한가요 에스 그럼 아이하나를 올려서 아이 1과 아이 2가 동일

한가요 에스 그럼 아이는 2가 됩니다. 아이 2와 3은 동일한가요 예스 그럼 아이는 3이됩니다.

아이 3 과 4는 동일한가요? 아니요 그럼 들어가지 않고 밖으로 나갑니다. 그럼 아이는

여기서 3에서 2로 하고 다시 +1 해서 3으로 들어가게 됩니다. 아니 4로 들어가게 됩니다.


*/


#include <iostream>

#include <string>


using namespace std;


int N;

string word;

bool check[26] = { false };

int index = 0;

int ans = 0;


void problem_in() {

cin >> word;


for (int i = 0; i < 26; i++) {

check[i] = false;

}

}


// aabbccdd a

// 01234567    이므로, 

/*

0 과 1이 동일하므로 아이는 1이 됩니다. 그리고 1과 2는 다르므로 와일문에서 벗어나고

아이는 2가 됩니다. 오케이요. 이게 그룹 단어인지 아닌지 어떻게 압니까? 문제를 잘 못 인식

했네요. 아하. 그럼 트루인곳을 다시 방문하려고 할때 이것은 아니다라고 표시하면 됩니다.

아니다 표시가 아니라 카운트에 세지 않으면 됩니다. 그럼 단순하게 

aa bb cc dd a 인데 하나씩 방문하면서 어디에 카운트를 넣으면 되나요?

aa bb cc dd a 를 하고 나서, 인덱스를 하고, 

*/

void solve() {


int cnt = 0;

for (int i = 0; i < word.length(); i++) {

index = word[i] - 'a';

if (check[index] == false) {

check[index] = true;


while (word[i] == word[i + 1]) {

i++;

}

}


else {

ans--;

break;

}

}

}


int main(void) {

cin >> N;

ans = N;

for (int i = 0; i < N; i++) {

problem_in();

solve();

}

cout << ans << endl;

return 0;


 문제를 잘 읽어야 할 필요성을 느꼈습니다. 그리고 지난간 것에 대해서는 bool 타입을 사용해서 false 처리를 하면 되고, 문제를 돌려서 풀 필요없이, 생각한 풀이 그대로 풀어내면 됩니다. 이프문 넣어서 false 처리한 것과 while 문 넣어서 처리한 것은 아주 잘 한것이라 생각됩니다.