PS

BOJ 3613 - Java vs C++

728x90

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

 

3613번: Java vs C++

문제 Java 예찬론자 김동규와 C++ 옹호가 김동혁은 서로 어떤 프로그래밍 언어가 최고인지 몇 시간동안 토론을 하곤 했다. 동규는 Java가 명확하고 에러가 적은 프로그램을 만든다고 주장했고, 동��

www.acmicpc.net

예외 사항에 대해서

여러가지 생각해야 되는게 많은 문제였다.

 

- 첫글자나 마지막 글자에 '_' 나 대문자가 오는가

- '_' 다음에 대문자가 오는가

- '_' 가 연속으로 나오는가

- c++ 이라 처리 했는데 대문자가 나오거나

- java 라 처리 했는데 '_' 가 나오거나

 

 

혼자서 문제풀때는 사실

이 모든 예외사항에 대한 부분들을 전부 생각해내지 못했다.

아래의 블로그를 보고나서 다른 예외사항들을 알 수가 있었다.

프로그래밍은 잘하는 사람들이 참 많은 것 같다

이 일을 앞으로 얼마나 할 수 있을지..

 

https://jaimemin.tistory.com/931

 

백준 3613번 Java vs C++

문제 링크입니다: https://www.acmicpc.net/problem/3613 예외처리가 매우 까다로운 문제였습니다. 대표적인 예외처리는 아래와 같습니다. 1. 첫 번째 문자로 '_'나 대문자가 나오는 경우 2. '_'가 연속으로 �

jaimemin.tistory.com

 

- c++

#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
 
    string str;
    cin >> str;
 
    bool isCpp = false, isJava = false, isError = false;
    string result;
 
    for (int i = 0; i < str.length(); i++)
    {
        // java
        if (isupper(str[i]))
        { // 대문자 이면서
            if (!|| isCpp)
            { // 첫글자이거나 cpp 언어가 아닌 경우
                isError = true;
                break;
            }
            // 들어온 문자가 java 언어이므로 이를 cpp 로 바꾸기 위해서
            // '_' 를 추가해주고, str[i] - 'A' + 'a' 는 아스키 코드 연산에 의해서 소문자로 바꾸겠다는 의미다.
            result += '_';
            result += str[i] - 'A' + 'a';
            isJava = true// 위 과정을 다 거치면 비로소 java 가 되므로 true 로 바꿈
        }
        // cpp
        else if (str[i] == '_')
        {
            // '_' 가 들어간 경우
            if (!|| isJava || i == str.length() - 1 || str[i + 1== '_' || isupper(str[i + 1]))
            { // 첫글자 이거나, 자바이거나, 끝 - 1 이거나(i + 1 번째에 대한 연산 필요), 다음글자에 _가 있거나 (연속된 '_' 가 오는 경우), 다음 문자가 대문자('_' 다음에 대문자가 온다는 뜻) 이거나 하면 오류다
                isError = true;
                break;
            }
            // 소문자로 바꿔서 삽입
            result += str[i + 1- 'a' + 'A';
            i++;
            isCpp = true// 위 과정을 다 거치면 비로소 cpp 가 되므로 true 로 변경
        }
        else
        {
            // 대문자나 '_' 둘다 아닌 경우 (소문자 일때) 는 그냥 삽입
            result += str[i];
        }
    }
 
    if (isError)
        cout << "Error!\n";
    else
        cout << result << '\n';
 
    return 0;
}
cs

 

 

 

 

아직 많은 문자열 문제를 풀어본 것은 아니지만,

내가 생각하기에 문자열 문제를 풀때는

 

1. 본래 있는 문자열 알고리즘을 사용하는 문제인가 (KMP, Rabin-Karp, Suffix Array, LCP 등)

2. 아스키 코드를 활용해서 문자열 처리가 가능한가 

3. 예외처리를 빠짐없이 할 수 있는가 

 

이 세가지를 어느정도 할 수 있어야 할 것 같다

 

 

문자열 알고리즘은 코테에 많이 나오기도 하지만

개인적으로 가장 어려운것 같다

 

728x90

'PS' 카테고리의 다른 글

BOJ 1002 - 터렛  (0) 2020.08.07
BOJ 1759 - 암호 만들기  (0) 2020.08.05
BOJ 1919 - 애너그램 만들기  (0) 2020.08.02
BOJ 1152 - 단어의 갯수  (0) 2020.08.01
BOJ 1753 - 최단 경로  (0) 2020.07.31