알고리즘/문제 풀이

백준 1283 - 단축키 지정 (C++)

qqlzzb 2024. 3. 29. 12:54

문제 

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

 

1283번: 단축키 지정

첫째 줄에 옵션의 개수 N(1 ≤ N ≤ 30)이 주어진다. 둘째 줄부터 N+1번째 줄까지 각 줄에 옵션을 나타내는 문자열이 입력되는데 하나의 옵션은 5개 이하의 단어로 표현되며, 각 단어 역시 10개 이하

www.acmicpc.net

풀이

일단 1) 단어 첫 글자가 단축키로 지정되었는지 확인

        2) 모든 첫 글자가 단축키로 지정되어 있다면 한 글자 한 글자 확인

        3) 그래도 다 지정되어 있다면 그냥 출력

이 과정을 코드로 구현했다.

단축키로 지정되어 있는지 확인하기 위해 set을 사용했다.(검색이 쉬워서)

 

c++로 문자열 문제 풀 때마다

공백 있는 문자열 입력받는 법, 공백 기준으로 나누는 법을 검색해서 풀고 있는데..

이번 기회에 확실히 정리했다.

 

공백 있는 문자열을 입력받을 때는 getline(cin, s)로 입력받으면 된다.

이때 주의할 점은 앞에서 입력받은 후에 버퍼에 남아있는 값을 지워줘야 한다는 것.

getline 전에 cin.ignore()를 해주면 된다.

 

공백 기준으로 문자열을 나눠서 벡터에 저장하려면 아래와 같다. sstream을 include 해야 한다.

stringstream ss(s);
vector<string> words;
string word;

while (getline(ss, word, ' ')) {
      words.push_back(word);
}

 

그리고 정말 바보 같은 실수 때문에 좀 헤맸는데,, 

대소문자 구분하지 않는다는 조건 때문에 추가한 chalpha 함수에서 부등호 쓸 때 =을 빼먹었다.. 그래서 a, z가 나오면 틀렸음

 

코드

#include <iostream>
#include <set>
#include <sstream>
#include <vector>

using namespace std;

char chalpha(char c) {
    if (c >= 'a' && c <= 'z') return c - ('a' - 'A');
    else return c + ('a' - 'A');
}

int main() {
    set<char> set;
    int N;
    cin >> N;
    cin.ignore();
    for (int i = 0; i < N; i++) {
        bool flag = false;
        int i1, i2;
        string s;
        getline(cin, s);

        stringstream ss(s);
        vector<string> words;
        string word;
        // 스트림을 한 줄씩 읽어, 공백 단위로 분리한 뒤, 결과 배열에 저장
        while (getline(ss, word, ' ')) {
            words.push_back(word);
        }

        //일단 단어별로 앞글자 확인
        for (int j = 0; j < words.size(); j++) {
            if (set.find(words[j][0]) == set.end()) {
                set.insert(words[j][0]);
                set.insert(chalpha(words[j][0]));
                i1 = j;
                i2 = 0;
                flag = true;
                break;
            }
        }
        //한글자한글자 확인
        if (!flag) {
            for (int j = 0; j < words.size(); j++) {
                if (flag) break;
                for (int k = 1; k < words[j].length(); k++) {
                    if (set.find(words[j][k]) == set.end()) {
                        set.insert(words[j][k]);
                        set.insert(chalpha(words[j][k]));
                        i1 = j;
                        i2 = k;
                        flag = true;
                        break;
                    }
                }
            }
        }
        if (!flag) {
            for (int j = 0; j < words.size(); j++) {
                cout << words[j] << " ";
            }
            cout << '\n';
        } else {
            for (int j = 0; j < words.size(); j++) {
                if (i1 == j) {
                    for (int k = 0; k < words[j].length(); k++) {
                        if (k == i2) {
                            cout << "[" << words[j][k] << "]";
                        } else cout << words[j][k];
                    }
                    cout << " ";
                } else cout << words[j] << " ";
            }
            cout << '\n';
        }
    }
}