ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Baekjoon_9093_단어 뒤집기
    Algorithm/_Baekjoon 2023. 5. 14. 18:40

    문제 주소: https://www.acmicpc.net/problem/9093

     

    9093번: 단어 뒤집기

    첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는

    www.acmicpc.net

     

    단어 뒤집기의 문제는 다음과 같습니다.

    해당 문제의 경우 주어진 문장의 각 단어들을 뒤집어야 합니다.

     

    Python

    저는 이 문제를 해결하기 위해서 이중 for문을 사용하였으며 코드는 다음과 같습니다.

    repeat_num = int(input()) # 입력할 문장의 갯수
    reverse_word = [] # 빈 list를 하나 생성
    for i in range(repeat_num): # 입력을 받은 값 만큼 반복
        word = input().split() # 문장을 입력받으며 띄어쓰기로 나눠서 list로 받음
        for j in range(len(word)): # 문장을 나눠받은 list의 갯수 만큼 반복을 함
            r_word = word[j][::-1] # 문장을 나눠받은 list의 순서대로 단어를 뒤집음
            reverse_word.append(r_word) # 뒤집은 단어를 위에서 생성한 빈 list에 추가
        print(' '.join(reverse_word)) # list로 나눠진 단어를 .join을 사용하여 하나로 합침
        reverse_word.clear() # list를 clear로 비워줌

    위의 코드에서의 특이점은 .join() 부분입니다. 이는 list로 분해된 것을 하나로 합쳐주는 역할을 합니다.

     

    하지만, 다른분들이 숏코딩을 한 것을 보면 다음과 같은 한줄 코드도 볼 수 있습니다.

    exec('print(*input()[::-1].split()[::-1]);'*int(input()))

    - exec(), eval()

    여기서 exec()를 볼 수 있습니다.

    이는 기본적으로 문자열로 된 코드를 Input으로 받아 그 코드를 실행만 시키고 아무것도 return 하지 않는 코드입니다.

    위의 경우는 *int(input())에서 우선 반복 횟수를 정한 후 내부의 문자열 수식을 사용합니다.

     

    exec()를 공부하신다면, eval()도 함께 보시는걸 추천합니다.

    차이점은 다음과 같습니다.

    exec(): 문자열로 된 수식을 input으로 받아 그 결과를 return하지 않습니다.

    eval(): 문자열로 된 수식을 input으로 받아 그 결과를 return합니다.

     

    C++

    #include <iostream>
    #include <string>
    #include <stack>
    
    using namespace std;
    
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(NULL);
    
        // 변수 설정
        int repeat_number;
        string sentence;
        stack <char> word;
    
        cin >> repeat_number; // 반복횟수 입력
        cin.ignore(); // 버퍼 비우기
    
        for (int i = 0; i < repeat_number; i++)
        {
            getline(cin, sentence); // 문자열 입력
            sentence += ' ';        // 문장의 끝 변화를 알기 위해 추가
    
            for (int j = 0; j < sentence.size(); j++) // sentence size만큼 반복
            {
                if (sentence[j] == ' ')
                {
                    while(!word.empty()) //word가 비워질 때까지 반복
                    {
                        cout << word.top(); // 맨 뒤의 스택 출력
                        word.pop(); // 맨 뒤의 스택 제거
                    }cout << ' ';
                }
                else
                {
                    word.push(sentence[j]); // 처음에 word에 단어 저장
                }
            }cout << "\n";
        }    
    }

    문제를 풀기 위해 2개의 for문과 1개의 while문을 사용했다.

    • getline을 통해 한 줄씩 받아옴.
    • 반복횟수 이후에 buffer를 비워줌. (ignore)
    • stack을 사용하여 stack 출력과 제거를 진행.

    'Algorithm > _Baekjoon' 카테고리의 다른 글

    Baekjoon_10845_큐  (0) 2023.05.18
    Baekjoon_1406_에디터  (0) 2023.05.17
    Baekjoon_1874_스택 수열  (0) 2023.05.15
    Baekjoon_9012_괄호  (0) 2023.05.14
    Baekjoon_10828_스택  (0) 2023.05.14
Designed by Tistory.