본문 바로가기

BOJ

Java vs C++

Day 6: 3613

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

어제 한번 건드렸던 문제다

예외 조건이 넘나시 까다로운것이라

코드를 한번 갈아엎고 다시 풀어보려고 한다


문제 조건들

1. 입력은 무조건 영어 알파벳 or 언더바('_')

2. "소문자단어_소문자단어_...._소문자단어" 는 C++ 형식

a. 대문자가 껴 있으면 안됨

b. 언더바는 맨 앞 또는 맨 뒤에 들어가면 안됨

c. 언더바는 두번 이상 반복되면 안됨

3. "소문자단어" + "대문자단어" + ... "대문자단어" 는 Java 형식

a. 첫 글자가 대문자면 안됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String input = s.nextLine();
        String javaStyle = "";
        String cppStyle = "";
        boolean java = true;
        boolean cpp = true;
        
        for (int i = 0; i < input.length() && (java || cpp); i++) {
            char charAtI = input.charAt(i);
            char prevChar;
            if (i == 0) prevChar = charAtI;
            else prevChar = input.charAt(i-1);
            
            if (i == 0 || i == input.length()-1) {
                if (charAtI == '_') {
                    cpp = false;
                    java = false;
                }
                if (i == 0) {
                    if ((charAtI >= 'A' && charAtI <= 'Z'))
                        java = false;
                }
            }
            if (prevChar == '_' && charAtI == '_')
                cpp = false;
            
            cpp = cpp && ((charAtI >= 'a' && charAtI <= 'z'|| charAtI == '_');
            java = java && ((charAtI >= 'A' && charAtI <= 'Z'|| (charAtI >= 'a' && charAtI <= 'z'));
        }
        
        boolean prevWasOdd = false;
        // do the string transformation
        if (cpp && java) {
            System.out.println(input);
        }
        else if (cpp) {
            for (int i = 0; i < input.length(); i++) {
                char charAtI = input.charAt(i);
                if (charAtI == '_') prevWasOdd = true;
                else if (prevWasOdd) {
                    javaStyle += Character.toUpperCase(charAtI);
                    prevWasOdd = false;
                }
                else
                    javaStyle += charAtI;
            }
            System.out.println(javaStyle);
        }
        else if (java) {
            for (int i = 0; i < input.length(); i++) {
                char charAtI = input.charAt(i);
                if (charAtI >= 'A' && charAtI <= 'Z')
                    cppStyle += "_" + Character.toLowerCase(charAtI);
                else
                    cppStyle += charAtI;
            }
            System.out.println(cppStyle);
        }
        else {
            System.out.println("Error!");
        }
    }
}
cs


호호


일부러 실행 시간을 줄이기 위해서

Early exit for loop도 쓰고 의미 없는 행 실행을 줄이기 위해서 구조를 나름 꼼꼼하게 짰는데

노력해야겠다

'BOJ' 카테고리의 다른 글

스택  (0) 2017.11.30
피보나치 함수  (0) 2017.11.29
한국이 그리울 땐 서버에 접속하지  (0) 2017.11.27
단어 공부  (0) 2017.11.26
단어의 개수  (0) 2017.11.24