[코딩 테스트 RUN] 코딩 기초 트레이닝 11일차: 리스트(배열)

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

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

 

 

점차 메서드와 로직에 익숙해져가고 있는 단계. 문제를 푸는 것에도 시간이 많이 단축되어 이번에는 20분에 전 문제를 해결했다.

 

 

문자 개수 세기

알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때, my_string에서 'A'의 개수, my_string에서 'B'의 개수,..., my_string에서 'Z'의 개수, my_string에서 'a'의 개수, my_string에서 'b'의 개수,..., my_string에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 return 하는 solution 함수를 작성해 주세요.

 

문제 해설

알파벳이 int화 되면 아스키코드가 나온다는 지점을 알고 있어야 한다. A는 65이기 때문에 ch - 65 = 0 이라는 A이다. 이 지점을 이용해서 answer의 index 0부터 채우면 된다. 다만 소문자와 대문자 사이에 다른 문자가 있음에 유의할 것.

 

 

정답

class Solution {
    public int[] solution(String my_string) {
        int[] answer = {};
        answer = new int[52];
        int index = 0;

        for(int i = 0; i < my_string.length(); i++){
            char ch = my_string.charAt(i);

            if(Character.isUpperCase(ch)){
                index = (int)(ch - 'A');
            } else {
                index = (int)(ch - 'a' + 26);
            }

            answer[index]++;

        }

        return answer;
    }
}

 

사실 형변환은 굳이 필요하지 않다.

 

 

배열 만들기 1

정수 n과 k가 주어졌을 때, 1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

 

문제 해설

answer의 배열 크기를 n / k하여 그 몫만큼으로 하면 된다. 그리고 answer의 요소는 i * k로 처리하면 된다(i가 0이기 때문에 +1해주는 것이 좋다.)

이번에는 거의 정석에 가깝게 풀었다.

 

 

정답

class Solution {
    public int[] solution(int n, int k) {
        
        int[] answer = {};
        
        int idx = n / k;
        answer = new int[idx];
                
        for(int i = 0; i < idx; i++){
            answer[i] = (i + 1) * k;
        }
        
        return answer;
    }
}

 

 

 

글자 지우기

문자열 my_string과 정수 배열 indices가 주어질 때, my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

 

문제 해설

사람에 따라 사고가 달라 다른 정답이 나올 수 있는 문제. 나의 경우에는 StringBuilder와 deleteCharAt을 사용하였다. indices의 요소를 정리하고, 한 글자씩 정리될 때마다 index가 앞당겨지는 걸 이용하였다.

 

정답

import java.util.Arrays;

class Solution {
    public String solution(String my_string, int[] indices) {
        StringBuilder answer = new StringBuilder(my_string);
        int index = 0;
        
        Arrays.sort(indices);
    
        for(int i = 0; i < indices.length; i++) {
            index = indices[i] - i;
            answer.deleteCharAt(index);
        }
        
        return answer + "";
    }
}

 

deleteCharAt(index)

index 위치에 있는 글자를 삭제한다.

 

 

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

class Solution {

    public String solution(String my_string, int[] indices) {
        String answer = "";
        String[] tmp = my_string.split("");

        for (int i = 0; i < indices.length; i++) {
            tmp[indices[i]] = "";
        }

        for (String x : tmp) {
            answer += x;
        }
        return answer;
    }
}

 

split을 하여 배열 tmp로 만들고 여기서 indices의 [i] 값인 인덱스를 ""로 한 뒤, 추가하는 형태가 된다.

 

 

카운트 다운

정수 start_num와 end_num가 주어질 때, start_num에서 end_num까지 1씩 감소하는 수들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

문제 해설

start_num에서 end_num을 뺀 값(+1)을 배열의 길이로 만들고, start_num에서 i만큼을 뺀 값을 answer 배열의 요소로 반환한다.

 

정답

class Solution {
    public int[] solution(int start_num, int end_num) {
        int[] answer = {};
        
        int idx = start_num - end_num + 1;
        answer = new int[idx];
        
        for(int i = 0; i < idx; i++){
            answer[i] = start_num - i;
        }
    
        return answer;
    }
}

 

제일 보편적인(제일 많이 제출된) 답으로 보인다.

 

 

 

 

가까운 1 찾기

정수 배열 arr가 주어집니다. 이때 arr의 원소는 1 또는 0입니다. 정수 idx가 주어졌을 때, idx보다 크면서 배열의 값이 1인 가장 작은 인덱스를 찾아서 반환하는 solution 함수를 완성해 주세요.

단, 만약 그러한 인덱스가 없다면 -1을 반환합니다.

 

문제 해설

예전에 했던 문제와 엇비슷하다.

for문으로 arr.length를 순환하여 만약 idx보다 인덱스가 크고 그 값이 1일 경우 그 인덱스값 i를 answer에 넣고 break; 처리하면 된다.

 

정답

class Solution {
    public int solution(int[] arr, int idx) {
        int answer = -1;
        
        for(int i = 0; i<arr.length; i++){
            if(i >= idx && arr[i] == 1){
                answer = i;
                break;
            }
        }
        
        return answer;
    }
}

 

제일 보편적인(제일 많이 제출된) 답으로 보인다.