© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 3613 - Java vs C++

2023-11-24
BOJ
실버 III
java
원본 문제 보기
구현
문자열
많은 조건 분기
파싱

문제

BOJ 3613 - Java vs C++

변수 이름이 주어질 때, Java 스타일(camelCase)이면 C++ 스타일(snake_case)로, C++ 스타일이면 Java 스타일로 변환하라. 어떤 스타일에도 해당하지 않으면 "Error!"를 출력한다.

입력

변수 이름이 한 줄로 주어진다 (영문 소문자, 대문자, 밑줄로만 구성).

출력

변환된 변수 이름 또는 "Error!"를 출력한다.

예제

입력출력
longAndVariableNamelong_and_variable_name
long_and_variable_namelongAndVariableName
_Error!

풀이

입력 문자열을 분석하여 Java 스타일인지 C++ 스타일인지 판별한 후, 반대 스타일로 변환한다.

  1. 첫 글자가 소문자가 아니면 에러로 처리한다
  2. flag 변수로 스타일을 추적한다: 1=Java(대문자 포함), 2=C++(밑줄 포함), 3=둘 다 아님
  3. 밑줄 연속, 밑줄로 끝남, 대문자와 밑줄 혼재 시 에러로 처리한다
  4. Java 스타일이면 대문자 앞에 밑줄을 삽입하고 소문자로 변환한다
  5. C++ 스타일이면 밑줄을 제거하고 다음 문자를 대문자로 변환한다

핵심 아이디어: 유효성 검증을 먼저 수행하고, 스타일에 따라 문자 단위로 변환 규칙을 적용한다.

코드

package day699;
 
import java.io.*;
 
public class Day657BOJ3613JAVAvsC {
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    char[] c_arr = br.readLine().toCharArray();
    int flag = 3;
 
    if (c_arr[0] < 97 || c_arr[0] > 122) {
      flag = 0;
    } else {
      for (int i = 1; i < c_arr.length; i++) {
        char c = c_arr[i];
        if (c == 95) {
          if (flag == 1) {
            flag = 0;
            break;
          } else {
            if (i == c_arr.length - 1) {
              flag = 0;
              break;
            } else if (c_arr[i + 1] == '_') {
              flag = 0;
              break;
            } else {
              flag = 2;
            }
          }
        } else if (c >= 65 && c <= 90) {
          if (flag == 2) {
            flag = 0;
            break;
          } else {
            flag = 1;
          }
        }
      }
    }
 
    if (flag == 0) {
      System.out.println("Error!");
    } else if (flag == 1) {
      convertToC(c_arr);
    } else if (flag == 2) {
      convertToJava(c_arr);
    } else {
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < c_arr.length; i++) {
        sb.append(c_arr[i]);
      }
      System.out.println(sb.toString());
    }
 
    return;
  }
 
  private static void convertToJava(char[] c_arr) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < c_arr.length; i++) {
      char c = c_arr[i];
      if (c == 95) {
        i++;
        sb.append((char) (c_arr[i] - 32));
      } else {
        sb.append(c);
      }
    }
    System.out.println(sb.toString());
    return;
  }
 
  private static void convertToC(char[] c_arr) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < c_arr.length; i++) {
      char c = c_arr[i];
      if (c >= 65 && c <= 90) {
        sb.append('_');
        sb.append((char) (c + 32));
      } else {
        sb.append(c);
      }
    }
    System.out.println(sb.toString());
    return;
  }
}

복잡도

  • 시간: O(N)
  • 공간: O(N)