재바기
JaeTech
재바기
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • Computer Vision (2)
    • 선형대수학 (9)
    • Papers (1)
    • 알쓸신잡 (7)
    • 삽질 기록 (0)
    • 3D\Multiview Geometry (10)
      • CS231A (10)
    • Computer Science (46)
      • Algorithm (14)
      • JavaScript (3)
      • C || C++ (5)
      • Git || Github (3)
      • Linux (2)
      • DL || ML (5)
      • Operating System (8)
      • Computer Network (0)
      • Database (1)
      • Effective Python (5)
      • Data Communication (0)
    • 회고 (0)
    • Latex (1)

블로그 메뉴

  • 홈
  • 태그

Github

공지사항

  • 주인장에 대해

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
재바기

JaeTech

(C++) 백준 3613번 [Java vs C++]
Computer Science/Algorithm

(C++) 백준 3613번 [Java vs C++]

2022. 12. 28. 20:56
728x90

오랜만에 알고리즘 포스팅이다.

생각보다 여러 케이스들을 생각하면서 일일이 반례를 찾아주어야 하는 문제라 꽤나 까다로웠던 것 같다.

실버3 난이도


1. 문제 해결 방법 구상

1. 일단 어떻게 입력이 들어올지 모른다. Java 형식으로 들어올 수도, C++ 형식으로 들어올 수도, 이도저도 아닌 형식으로 들어올 수도 있다.

 

2. 이도저도 아닌 케이스를 찾아내는 것이 관건이다.

- 일일이 다 찾아서 if문으로 걸러내야한다.

(1) 첫번째 글자가 _나 대문자로 시작하는 경우 (ex. _asd, Asd)

(2) 마지막 글자가 _로 끝나는 경우 (ex. asd_)

(3) C++의 경우 _바로 뒤에 대문자가 오는 경우 (ex. asd_Asd)

(4) (3)의 경우랑 비슷하긴 하나 _바로 뒤가 아니라 중간 글자가 대문자인 경우 (ex. asd_aSd)

(5) 첫번째 글자가 대문자인 경우 (ex. Asd)

 

3. Java를 C++로, C++를 Java로는 어떻게 바꿀 것인지도 고민주제이다.

(1) Java to CPP : 대문자 기준으로 끊음

(2) CPP to Java : _ 기준으로 끊음


2. 해결 방법 구상에 따라 코드 구현

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <cctype>

using namespace std;

bool isCpp(string str) {
    for(auto e : str) {
        if(e == '_') return true;
    }

    return false;
}

int main() {
    bool first = true;
    string str, buf, ans;
    vector<string> words;
    cin >> str;

    // 첫 번째 글자가 _나 대문자로 시작하는 경우
    // _asd, Asd
    if(!islower(str[0])) {
        cout << "Error!";
        return 0;
    }

    // 마지막 글자가 _로 끝나는 경우
    // asd_
    if (str[str.size()-1]=='_') {
        cout << "Error!";
        return 0;
    }

    if(isCpp(str)) {
        istringstream ss(str);
        while (getline(ss, buf, '_')){
            words.push_back(buf);
        }
        for(auto w : words) {
            if (islower(w[0])) {
                if (first) {
                    first = false;
                }
                else {
                    w[0] = toupper(w[0]);
                }
                ans += w;
            }
            // c++인데 _뒤에 바로 첫 글자가 소문자가 아닌 경우
            else {
                cout << "Error!";
                return 0;
            }
            for (int i = 1; i < w.size(); i++) {
                if (isupper(w[i])) {
                    // 두 번째 이상 글자가 소문자가 아닌 경우
                    cout << "Error!";
                    return 0;
                }
            }
        }
    }
    else {
        for(auto e : str) {
            if (isupper(e)) {
                ans += buf;
                ans += '_';
                buf.clear();
                buf += tolower(e);
            }
            else {
                buf += e;
            }
        }
        ans += buf;
    }

    cout << ans;
    return 0;
}

3. 느낀 점

 

DP나 그래프 문제와는 달리, 이 문제처럼 까다로운 조건들을 다 생각해내야 하는 문제가 당황스러운 것 같기도하다.

이런 edge 케이스들을 잘 찾아내는 것 또한 실력이다.

더 성실하게 문제를 풀어나가도록 하자.

 

 

 

/ /문제제기 및 피드백 언제든지 감사히 받겠습니다.

728x90
저작자표시 비영리 (새창열림)

'Computer Science > Algorithm' 카테고리의 다른 글

(C++) 백준 1012번 [유기농 배추]  (0) 2023.01.03
(C++) 백준 1260번 [DFS와 BFS]  (0) 2022.12.30
(C++) 백준 1915번 [가장 큰 정사각형]  (0) 2021.03.10
(C++) 백준 2468번 [안전 영역]  (0) 2021.03.10
(C++) 백준 1149번 [RGB거리]  (0) 2021.03.07
    'Computer Science/Algorithm' 카테고리의 다른 글
    • (C++) 백준 1012번 [유기농 배추]
    • (C++) 백준 1260번 [DFS와 BFS]
    • (C++) 백준 1915번 [가장 큰 정사각형]
    • (C++) 백준 2468번 [안전 영역]
    재바기
    재바기
    재박이의 테크블로그

    티스토리툴바