목록문자열 (3)
궤도
문제 풀이 문제를 풀기 위해 문자열을 숫자화 했다. 간단하게 결과만 먼저 말하면, happy->01223 / new->123 / abab->0101로 숫자화 된다. 결과를 보면 알겠지만 그룹 단어라면 숫자화된 결과 값이 non-decreasing의 모습을 하고 있다. 이제 어떻게 이런 숫자가 나왔는지 설명하도록 하겠다. 각 알파벳을 숫자로 바꿀 flag 변수를 선언하고, 0으로 초기화 한다. 그리고 문자열을 처음부터 돌며 각 문자를 확인한다. 해당 문자가 등장한 적 없다면 현재의 flag 값으로 반영해주고 flag를 증가한다. 만약 읽었던 알파벳이라면 해당 알파벳에 어떤 flag값이 반영됐었는지에 대한 정보가 저장됐기 때문에 그냥 그걸 바로 가져오면 된다. 이렇게 문자열을 숫자로 바꿔서 non-decre..
문제 풀이 이 문제의 핵심은 두 가지 있다. 하나는 띄어쓰기를 포함해 입력을 받는 것이고, 다른 하나는 다양한 입력 경우의 수를 고려해 단어의 수를 세는 것이다. getline 함수를 이용하면 띄어쓰기를 포함해서 입력을 받을 수 있다. 다만 입력을 저장하는 변수의 자료형에 따라 사용법이 다르다. string str; getline(cin, str, '\n'); char c[1000]; cin.getline(c, 1000, '\n'); 마지막 인자로 들어간 '\n'는 생략할 수 있다. default 값으로 '\n'이 들어가고, 사용자가 원하는 값을 임의로 넣을 수도 있다. 'a'를 넣을 수도 있고, ' '를 넣을 수도 있다. 입력을 받았으니 단어의 수를 셀 차례이다. 공백이 연속으로 나오는 경우는 없다고 ..
문제 풀이 일단 알파벳의 등장 횟수를 체크해야하니 알파벳의 개수만큼의 크기를 가진 배열(alpha[26])을 만들어준다. 소문자 영어의 아스키코드는 97부터 시작하고 대문자 영어의 아스키코드는 65부터 시작한다. 소문자와 대문자를 구분하지 않으니 대소문자 여부를 판단해 적절히 alpha 배열에 넣어준다. 완성된 alpha 배열을 돌며 최대값을 찾아야 하는데, 그와 동시에 해당 최댓값에 해당하는 알파벳이 2개 이상인지도 체크해야 한다. 이를 위해 bool 변수 flag를 뒀다. 영어 대소문자 문제는 많으니까 각각의 아스키코드를 외워두는게 나쁘진 않을 것 같다. 소스코드 #include #include using namespace std; int main() { int alpha[26], max = 0, m..