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

2022. 11. 7. 15:20PS (Program Solving)/BOJ (백준)

문제 설명

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

 

3613번: Java vs C++

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

www.acmicpc.net

백준 BOJ 3613번 Java vs C++ 문제 사진

 

접근 방법 - 문자열 연산의 심화 문제

백준의 3613번 문제는 문자열 연산에 있어 심화적인 부분을 다루고 있는 문제이다.

해당 문제는, 입력받은 변수명이 java 형식인지 cpp 형식인지 알아내고 이를 반대 형식으로 바꾸어 출력해야 하는 문제이다.

필자가 개인적으로 느끼기엔, 형식을 바꾸어 출력하는 건 생각보다 쉬웠지만 형식을 알아내는 과정이 꽤 힘들었다.

생각해야 할 예외적인 상황들이 너무 많아, 연이어 제출하면서 계속 보완해나갔기 때문이다.

그렇게라도 해서 어렵사리 해결은 하였지만, 코드가 복잡하고 길어져 해결하고 나서도 찝찝한 문제이다.

그래서 설명을 조금 자세하게 작성해보았으니, 혹여나 해결에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 문자열(st)을 입력받는다.

 

2) cpp 형식인 특징 개수를 저장할 변수 cpp를 0으로 초기화하여 선언한다.

마찬가지로, java 형식인 특징 개수를 저장할 변수 java를 0으로 초기화하여 선언한다.

 

3) 우선은, st가 cpp 형식인지 java 형식인지 판별해야 한다.

- 대문자가 있는 경우는 java 형식이지만 예외적으로 첫 글자는 취급하지 않기 때문에, 만약 이 경우엔 "Error!"를 출력하고 즉시 실행 종료한다.

- 문자열 중에 _(밑줄)이 있는 경우는 cpp 형식이지만, _(밑줄)을 2번 사용하거나 문자열 양 끝으로 있는 경우는 취급하지 않는다. 따라서 이 경우엔 "Error!"를 출력하고 즉시 실행 종료한다.

다만 이 2가지 경우가 아니라면, cpp 형식의 특징이기 때문에 cpp에 1을 더해준다.

- 대문자가 있는 경우는 (위 과정에서 실행 종료된 경우가 아닌 이상) java 형식이기 때문에, 이 경우엔 java에 1을 더해준다.

- 소문자는 cpp에도 java에도 모두 사용되기 때문에, continue를 사용해 다음 문자를 확인해본다.

- 위 글자 모두 아닌 경우는 cpp도 java도 모두 아니기 때문에, 이 경우엔 "Error!"를 출력하고 즉시 실행 종료한다.

- 만약 st에 java 특징이 하나도 나타나지 않은 경우는 cpp 형식이기 때문에 cpp에 1을 더해준다.

 

4) 저장된 java 변수와 cpp 변수의 값에 따라, 아래의 연산을 취한다.

- 만약 cpp의 값이 양수이고  java의 값이 0이라면, 이는 cpp 형식이다. 이 경우, 아래처럼 연산을 취한다. (cpp -> java)

_(밑줄)이 탐색된 경우, 그다음 영문자를 대문자로 변경하여 출력한다.
나머지 문자들은 그대로 출력하도록 한다.

- 만약 java의 값이 양수이고 cpp의 값이 0이라면, 이는 java 형식이다. 이 경우, 아래처럼 연산을 취한다. (java -> cpp)

대문자가 탐색된 경우, _(밑줄)을 출력하고 해당 대문자를 소문자로 변경하여 출력한다.
나머지 문자들은 그대로 출력하도록 한다.

- 만약 java와 cpp의 값 모두 0이라면, 그 어떤 형식도 아니기 때문에 "Error!"를 출력한 뒤 실행 종료한다.

5) 모든 출력이 완료되었다면, 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <string>
#define endl '\n'
using namespace std;

//백준 3613번 코드
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	string st;
	cin >> st;
	
	int cpp = 0, java = 0;
	if (st[0] >= 'A' && st[0] <= 'Z') {
		cout << "Error!" << endl;
		return 0;
	}
	for (int i = 0; i < st.length(); i++) {
		if (st[i] == '_') { 
			if (st[i + 1] == '_' || i == st.length() - 1 || i == 0) {
				cout << "Error!" << endl;
				return 0;
			}
			cpp++; 
		}
		else if (st[i] >= 'A' && st[i] <= 'Z') { java++; }
		else if (st[i] >= 'a' && st[i] <= 'z') { continue; }
		else {
			cout << "Error!" << endl;
			return 0;
		}
	}
	if (java == 0) { cpp++; }

	if (cpp > 0 && java == 0) {	//cpp -> java
		for (int i = 0; i < st.length(); i++) {
			if (st[i] == '_') {
				cout << (char)(st[++i] - 32);
				continue;
			}
			cout << st[i];
		}
		cout << endl;
	}
	else if (java > 0 && cpp == 0) {	//java -> cpp
		for (int i = 0; i < st.length(); i++) {
			if (st[i] >= 'A' && st[i] <= 'Z') {
				cout << "_" << (char)(st[i] + 32);
				continue;
			}
			cout << st[i];
		}
		cout << endl;
	}
	else {
		cout << "Error!" << endl;
	}
}

 

제출 결과

백준 BOJ 3613번 Java vs C++ 문제 C++ 제출 결과

(2022.06.16 백준 3613번 문제 제출 결과)

맞왜틀의 흔적들

반응형