[코딩 테스트 RUN] 코딩 기초 트레이닝 17일차: 문자열

코테런/코딩 기초 트레이닝(완주)
2026.02.22

⚠️ 주의!
프로그래머스에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.

 

 

 

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

문자열 myString과 pat가 주어집니다. myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.

 

 

문제 해설

lastIndexOf를 사용하면 편하다.

 

lastIndexOf(str, [index])

끝에서부터 문자열(str)의 위치를 탐색하여 그 인덱스를 반환한다. index는 옵션으로 [index]부분부터 찾아볼 수 있다.

 

정답

class Solution {
    public String solution(String myString, String pat) {
        
        for(int i = myString.length() - pat.length(); i > 0; i--) {
            
        int lastIdx = myString.lastIndexOf(pat);
        if (lastIdx == -1) return "";
        return myString.substring(0, lastIdx + pat.length());         

        }
        return "";
    }
}

 

 

뒤늦게 깨달았는데 lastIndexOf를 쓸거면 딱히 for문을 사용하지 않아도 된다. 원래는 indexOf를 쓰려다가 남아있는 잔재다.

 

class Solution {
    public String solution(String myString, String pat) {
            
        int lastIdx = myString.lastIndexOf(pat);
        if (lastIdx == -1) return "";
        return myString.substring(0, lastIdx + pat.length());         

    }
}

 

이렇게 정리가 가능.


문자열이 몇 번 등장하는지 세기

문자열 myString과 pat이 주어집니다. myString에서 pat이 등장하는 횟수를 return 하는 solution 함수를 완성해 주세요.

 

문제 해설

반복문으로 순회하면서 위치가 일치하면(indexOf 등으로 확인) answer를 증가시킨다.

 

정답

class Solution {
    public int solution(String myString, String pat) {
        int answer = 0;
        int i = 0;
        
        while(myString.indexOf(pat, i) != -1) {
                answer++;
                i = myString.indexOf(pat, i) + 1;          
        }
        
        
        return answer;
    }
}

 

가장 많이 좋아요를 받은 것은 이것.

class Solution {
    public int solution(String myString, String pat) {
        int cnt = 0;
        for(int i=0; i<myString.length(); i++) {
            if(myString.substring(i).startsWith(pat)){
                cnt++;
            }
        }
        return cnt;
    }
}

 

substring과 startsWith를 사용하여 true라면 cnt를 증가시킨다.

 

 


ad 제거하기

문자열 배열 strArr가 주어집니다. 배열 내의 문자열 중 "ad"라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.

 

 

문제 해설

ArrayList를 사용하여 ad를 포함하지 않은 strArr의 요소를 받은 뒤, String이므로 toArray를 쓰면 편해진다.

 

 

정답

import java.util.ArrayList;

class Solution {
    public String[] solution(String[] strArr) {
        String[] answer = {};
        ArrayList <String> list = new ArrayList<>();
        
        for(int i = 0; i < strArr.length; i++) {
            if(!strArr[i].contains("ad")) {
                list.add(strArr[i]);
            }
        }
                
        return list.toArray(new String[0]);
    }
}

 


공백으로 구분하기 1

단어가 공백 한 개로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

문제 해설

split을 사용해 공백으로 나눠 배열로 돌려주면 편해진다.

 

정답

class Solution {
    public String[] solution(String my_string) {
        String[] answer = my_string.split(" ");
        
        return answer;
    }
}

 

제일 많이 좋아요를 받은 건 다른 것이다(이게 가장 보편적인 풀이다.)

 

import java.util.ArrayList;

class Solution {
    public ArrayList<String> solution(String my_string) {
        ArrayList<String> answer = new ArrayList();

        String a = "";

        for(int i=0; i<=my_string.length();i++){
                if(my_string.charAt(i) == ' '){
                    answer.add(a);
                    a = "";
                }else if(i == my_string.length()-1){
                    a += Character.toString(my_string.charAt(my_string.length()-1));
                    answer.add(a); 
                    break;
                }else{
                    a += Character.toString(my_string.charAt(i));    
                }
          }




        return answer;
    }
}

 

ArrayList를 사용하여, charAt(i)가 공백문자라면 이전의 a를 넣고, a는 공백처리한다. 공백이 아니되 i가 길이의 마지막이라면 거기에 a를 추가하고 answer에 추가 후 break한다. 아닐 경우, a만을 추가한다는 형태. split을 사용하지 않는 원초적인 풀이라서 좋지만, 문자열을 새로 추가하기 때문에 메모리와 연산적으로는 비효율적이긴 하다.


공백으로 구분하기 2

단어가 공백 한 개 이상으로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

문제 해설

앞뒤 공백을 trim()으로 제거한 뒤 정규식을 통해 split하면 쉽다.

일반적인 1이상의 공백에 대한 정규식은 \\s+이다.

여기서 함정은 trim 제거이니 주의할 것. 안 하면 빈 요소가 생긴다.

 

정답

class Solution {
    public String[] solution(String my_string) {
        
        return my_string.trim().split("\\s+");
    }
}

 

다른 정규식으론 [ ]+도 사용되었다.