본문 바로가기
CS(Computer Science)지식/[C++][코딩 테스트] 자료구조 및 알고리즘

[C++] 백준 3613번: Java vs C++

by 엔지니어 청년 2024. 2. 4.

문제링크

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

풀이방법

해당 문제는 다양한 조건을 전부 고려해야 한다는 부분에서 어려운 문제라고 생각한다. 하나라도 놓치면 해당 문제를 맞출 수 없기 때문에 다음과 같은 조건을 잘 고려해야 한다.

  • 맨 뒤 문자가 '_' 이면 (Error!)
  • 맨 앞 문자가 '_' 이면 (Error!)
  • '_' 연속 두개 존재하면 (Error!)
  • 맨 앞 문자가 대문자면 에러 (Error!)
  • 대문자와 '_'가 각각 1개 이상 동시에 존재하면 (Error!)
  • 그 외에 문제에서 정해진 조건인 영어 알파벳과 밑줄('_')로만 이루어져 있는 경우는 정상이라고 볼 수 있다.

아래 코드의 주석을 참고해서 해당 문제를 이해하자!

코드

#include <bits/stdc++.h>
using namespace std;



char change(char c)
{
	if ('A' <= c && c <= 'Z')
	{
		return c + 32;
	}
	else
	{
		return c - 32;
	}
}

int main() {

	ios::sync_with_stdio(false);
	cin.tie(0);
	string s;
	cin >> s;

	bool isError = false;
	vector<char> v;


	if (s[0] == '_' || s[s.size() - 1] == '_' || ('A' <= s[0] && s[0] <= 'Z'))
	{
		isError = true;
	}
	/*
	  맨 뒤 문자가 '_'  이면 (Error!)

      맨 앞 문자가 '_'  이면 (Error!)

      맨 앞 문자가 대문자면 에러 (Error!)
	*/

	
	for (int i = 0; i < s.size() - 1; i++)
	{
		if (s[i] == '_' && s[i + 1] == '_')
		{
			isError = true;
		}	
	}
	/* '_' 연속 두개 존재하면 (Error!) */

	int cntA = 0;
	int cntB = 0;

	for (int i = 0; i < s.size(); i++)
	{
		if ('A' <= s[i] && s[i] <= 'Z')
		{
			cntA++;
		}
		if (s[i] == '_')
		{
			cntB++;
		}

		if (cntA >= 1 && cntB >= 1)
		{
			isError = true;
		}
	}
	/*대문자와 '_'가 각각 1개 이상 동시에 존재하면(error!)*/



	int nxt_pos = s.find('_'); 
	if (nxt_pos != -1 && isError == false) // C++ 형식인 경우
	{
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i]!='_')
			{
				v.push_back(s[i]);
			}
			else
			{
				v.push_back(change(s[i + 1]));
				i++;
			}
		}

		for (auto c : v)
		{
			cout << c;
		}
	}
	else if (nxt_pos == -1 && isError == false) // Java 형식인 경우
	{
		for (int i = 0; i < s.size(); i++)
		{
			if ('A' <= s[i] && s[i] <= 'Z')
			{
				v.push_back('_');
				v.push_back(change(s[i]));
			}
			else
			{
				v.push_back(s[i]);
			}
		}

		for (auto c : v)
		{
			cout << c;
		}
	}
	else // isError가 True인 경우
	{
		cout << "Error!" << '\n';
	}
}