본문 바로가기
생각정리

BOJ PS java 2941 크로아티아 알파벳

by puy0 2023. 2. 17.
package org.problem.solving.BOJ;

import java.util.Scanner;

public class Java2941 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        sc.close();
        int num =0;
        for (int i=0;i<s.length();i++){
            switch (s.charAt(i)){
                case 'c': case 's': case 'z':
                    if (i+1<s.length()){
                        if (s.charAt(i+1)=='='){
                            i++;
                        } else if (s.charAt(i+1)=='-') {
                            i++;
                        }
                    }
                    num+=1;
                    break;
                case 'l': case 'n':
                    if (i+1<s.length()){
                        if (s.charAt(i+1)=='j'){
                            i++;
                        }
                    }
                    num+=1;
                    break;
                case 'd':
                    if (i+1<s.length()){
                        if (s.charAt(i+1)=='-'){
                            i++;
                        } else if (s.charAt(i+1)=='z'){
                            if (i+2<s.length()){
                                if (s.charAt(i+2)=='='){
                                    i+=2;
                                }
                            }
                        }
                    }
                    num+=1;
                    break;
                default:{num+=1;break;}
            }
        }
        System.out.println(num);
    }
}

가끔 버퍼리더가 빨라서 버퍼리더를 사용한다

하지만 스케너,버퍼리더 비교로 빠르게하는건 의미가없고 내 알고리즘이 빨라지는게 중요하다 생각해서 그냥 스케너를 사용했다

입출력이 무엇이든 내 알고리즘이 느리면 어차피 실패라고 생각했다

하지만 빠른 입출력은 그냥 기본이라고 하더라..

 

스위치 케이스를 사용했고 String의 인덱스 값을 기준으로 대입해가면서 판단하는 방법을 사용했다

처음에는 OutOfBounds 가 떳다

s의 i번째 인덱스 값이 해당 케이스일때 그 안에서 i+1,2한 값을 비교하는대

s 문자열의 마지막,맞 마지막에서 i+1,2값을 조회할수 없기때문이다

그래서 결국 하나의 크로아티아 알파벳에

여러개의 문자가 들어갈경우 s의 i뒤에 문자가 더있는지 if문 으로 체크 해줬다

결국 무수한 for if else로 뒤덮힌 지저분한 코드가 되었다

28분동안 s[i]의 마지막 자리 체크를 5분정도 사용,

불필요한 절차를 줄이는데 20분 정도를 썻다

할수있는건

연산해야할 사항이 아니라서 바로num+=1 해주는 else를 싸그리 묶어 break 되기 직전에 한번만 num+=1 되도록 했다

나름 잘 청소 했다고 생각했다

 

204ms가 나왔고

다른사람의 소스를 보는데

104초가 나오더라..

다들 비슷한 처리를 했는대

switch case 를 쓴사람은 별로 없었다

그래서 그런지 내가 청소해서 3번 으로 줄인 num+=1 도 단한번 사용 하고 있었다

 

사실 내가 switch case를 사용한 이유는 바로 전에 푼 문제가 그방법을 사용했는대

if는 많이 썼으니 비교적 잘 안쓰는 문법을 사용해볼 좋은 상황 이었다

나름 만족 스럽다

댓글