알고리즘 일기 - 백준 2941

0cean·2024년 1월 2일
0

알고리즘

목록 보기
2/4

문제 내용

입,출력

처음에는 크로아티아 알파벳을 전부 배열에 선언해서 배열을 전부순회하면서 문자열에 포함되어있으면 정답값을 1씩 늘려주고, 해당 문자열을 replace하는 방식으로 구현했지만 게속되는 틀렸다는 정보에 코드를 다시 천천히 보았다.

하지만 for문 안에서 자르다보니 밖에서는 적용이 되지 않았던것.. 그래서 계속 정답 값이 1이었다.

수정 전 코드

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String[] specialAlphabet = {"c=","c-","dz=","d-","lj","nj","s=","z="};
        String str = sc.next();
        int answer = 0;
        
        for(int i = 0; i < str.length(); i++){
            for(int j = 0; j < specialAlphabet.length; j++){
                if(str.contains(specialAlphabet[j])){
                    answer++;
                    str = str.replaceAll(specialAlphabet[j],"");
                    break;
                }
            }
        }
        answer += str.length();
        System.out.print(answer);
    }
}

원인을 찾고나서 어떻게 해결하지 생각을 하다가 찾은게 문자열의 startsWith 였다.

수정 후 코드

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        String[] specialAlphabet = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

        int answer = 0;
        for (int i = 0; i < str.length(); ) {
            boolean foundSpecial = false;
            for (String special : specialAlphabet) {
                if (str.startsWith(special, i)) {
                    answer++;
                    i += special.length();
                    foundSpecial = true;
                    break;
                }
            }
            if (!foundSpecial) {
                answer++;
                i++;
            }
        }
        System.out.print(answer);
    }
}

복잡하지 않게 배열에 저장된 문자열로 시작하는 경우에 수정전에 작성했던 로직을 적용시키고 그 문자열의 길이만큼 인덱스를 당기면 되는 문제였다. 만약 다른 유형으로도 endWith가 있던데 그걸 쓸수도 있는 방법인것 같다.

항상 문자열 문제가 가장 어려운듯하다.. 너무 모르는 함수들이 많아서..

profile
주도적인 학습으로 성장하는 개발자가 되겠습니다

0개의 댓글