PS/백준

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

팡세영 2022. 7. 12. 19:31


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

 

3613번: Java vs C++

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

www.acmicpc.net


[문제 설명] 

  • 문자열을 이용한 간단한 구현 문제이며 조건 처리만 잘해주면 되므로 반례만 설명 드리겠습니다

  • Cpp: 맨 뒤, 맨 앞 문자가 '_' 이면 에러, '_' 연속 두개면 에러
  • Java: 맨 앞 문자가 대문자면 에러
  • Cpp와 Java를 혼용하는 경우: 대문자와 '_'가 혼종이면 에러
  • 그 외: 소문자만 입력 될 경우 정상, 대문자 연속일 경우 정상
  •  

//c++  형식에 위배
//맨 뒤 문자가 '_' 이면 에러
pang_
Error! 

//c++  형식에 위배
//맨 앞 문자가 '_' 이면 에러
_pang
Error!

//c++  형식에 위배
//'_' 연속 두개면 에러
pang__seyoung
Error!

//Java 형식에 위배
//맨 앞 문자가 대문자면 에러
Seyoung
Error!

// Java와 Cpp 혼용 
//대문자와 '_'가 혼종이면 에러
Seyoung_Park
Error!

// 그 외의 경우
//소문자만 입력 될 경우 정상
seyoung
seyoung

// 그 외의 경우
// 대문자 연속일 경우 정상
seYOUNG
se_y_o_u_n_g


Java

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    static boolean whatIsLanguage = false;     // false: c++, true: java
    static boolean allOfLower = true;

    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder(br.readLine());

        // Java, C++ 형식에 맞지 않을 경우
        if(!(is_Cpp(sb) && is_Java(sb) && name_check(sb))){
            System.out.println("Error!");
            return;
        }

        // 모든 문자가 소문자일 경우 그대로 return
        if(allOfLower){
            System.out.println(sb.toString());
            return;
        }

        // true = java, false = Cpp
        if(whatIsLanguage) sb = javaToCpp(sb);
        else sb = cppToJava(sb);

        System.out.println(sb.toString());

    }

    public static boolean name_check(StringBuilder sb){
        int isUpperCase = 0;
        int isUnderBar = 0;

       for(int i=0; i < sb.length(); i++){
           char ch = sb.charAt(i);

           if(ch >= 'A' && ch <= 'Z') isUpperCase = 1;
           else if(ch == '_') isUnderBar = 1;
       }

       allOfLower = (isUnderBar == 1 || isUpperCase == 1) ? false : true;

        // Java와 Cpp 형식을 혼용 했을때 false return
       if((isUnderBar & isUpperCase) == 0 || allOfLower) {
           whatIsLanguage = (isUnderBar == 1) ? false : true;
           return true;
       }else return false;

    }

    public static boolean is_Cpp(StringBuilder sb){
        if(sb.charAt(sb.length()-1) == '_') return false;
        else if(sb.charAt(0) == '_') return false;
        else if(sb.indexOf("__") >= 0) return false;

        return true;
    }

    public static boolean is_Java(StringBuilder sb){
        return (sb.charAt(0) >= 'A'&& sb.charAt(0) <= 'Z') ? false : true;
    }

    public static StringBuilder javaToCpp(StringBuilder sb){
        for(int i=0; i<sb.length(); i++){
            char ch = sb.charAt(i);
            if(ch >= 'A' && ch <= 'Z'){
                sb.replace(i, i+1, String.valueOf(ch).toLowerCase());
                sb.insert(i, "_");
            }
        }
        return sb;
    }

    public static StringBuilder cppToJava(StringBuilder sb){
        for(int i=0; i<sb.length(); i++){
            if(sb.charAt(i) == '_'){
                sb.deleteCharAt(i);
                sb.replace(i+1, i+1, String.valueOf(sb.charAt(i)).toUpperCase());
                sb.deleteCharAt(i);
            }
        }
        return sb;
    }



}