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

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

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

 

 

 

이어서 14일째. 슬슬 엔딩이 보인다!

 

홀수 vs 짝수

정수 리스트 num_list가 주어집니다. 가장 첫 번째 원소를 1번 원소라고 할 때, 홀수 번째 원소들의 합과 짝수 번째 원소들의 합 중 큰 값을 return 하도록 solution 함수를 완성해주세요. 두 값이 같을 경우 그 값을 return합니다.

 

문제 해설

num_list를 순회하며 홀수냐 짝수냐에 따라서 구분하여 odd를 추가하고 even을 추가하면 된다.

for문 방식으로 두개로 나누어 순회했다.

 

정답

class Solution {
    public int solution(int[] num_list) {
        int answer = 0;
        int odd = 0, even = 0;
        
        for(int i = 0; i < num_list.length; i += 2) {
            odd += num_list[i];
        }
        
        for(int i = 1; i < num_list.length; i += 2) {
            even += num_list[i];
        }
        
        answer = Math.max(odd,even);
        
        
        return answer;
    }
}

 

if문으로 나누기 연산을 하는 방법도 있고, answer도 삼항연산으로 푸는 방법도 있다. 효율적으로는 앞쪽이 낫기도.

 


5명씩

최대 5명씩 탑승가능한 놀이기구를 타기 위해 줄을 서있는 사람들의 이름이 담긴 문자열 리스트 names가 주어질 때, 앞에서 부터 5명씩 묶은 그룹의 가장 앞에 서있는 사람들의 이름을 담은 리스트를 return하도록 solution 함수를 완성해주세요. 마지막 그룹이 5명이 되지 않더라도 가장 앞에 있는 사람의 이름을 포함합니다.

문제 해설

5명이 되지 않더라도 앞에 있는 사람이 들어감에 주의. 나의 경우는 answer의 배열 길이를 names.length - 1을 5로 나누었다. 최소 하나가 있으니 거기에 1을 추가.

이후로는 5씩 건너뛰며 answer에 넣어주면 된다.

 

정답

class Solution {
    public String[] solution(String[] names) {
        String[] answer = {};
        answer = new String[1 + (names.length - 1) / 5];

        for(int i = 0, j = 0; i < answer.length; i++){
            answer[i] = names[j];
            j +=5;
        }

        return answer;
    }
}

 

사실 j를 answer[j++] 형태로 하여 i를 +=5로 해두는 쪽이 낫다.

 


할 일 목록

오늘 해야 할 일이 담긴 문자열 배열 todo_list와 각각의 일을 지금 마쳤는지를 나타내는 boolean 배열 finished가 매개변수로 주어질 때, todo_list에서 아직 마치지 못한 일들을 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

문제 해설

for문으로 순회하여 finised[i]가 false라면 추가하고, 그렇지 않으면 추가하지 않도록 한다. 나의 경우는 length를 구하기 위해 먼저 순회해서 구했다.

 

정답

class Solution {
    public String[] solution(String[] todo_list, boolean[] finished) {
        String[] answer = {};
        int l = 0;
        
        for(int i = 0; i < todo_list.length; i++){
            if(!finished[i]) {
                l++;
            }
        }
        
        answer = new String[l];
        
        for(int i = 0, j = 0; i < todo_list.length; i++) {
            if(!finished[i]) {
                answer[j++] = todo_list[i];
            }
        }
        
        return answer;
    }
}

 

제일 좋아요를 많이 받은 것은 이것.

 

class Solution {
    public String[] solution(String[] todo_list, boolean[] finished) {
        String str = "";
        for(int i=0; i<finished.length; i++){
            str = finished[i]==false ? str+todo_list[i]+"," : str;
        }

        return str.split(",");
    }
}

 

split부분에 유의. String으로 합쳐 넣고 이것을 split으로 나누어 배열로 환산한 것이다. 이 경우 answer의 배열 길이를 세지 않아도 된다. 다만 조건에 영소문자로만 이루어져 있기 때문에 가능하고, 만약 todo_list에 ,가 있으면 깨지므로 그 부분의 조건에 주의해야 한다.

 


n보다 커질 때까지 더하기

정수 배열 numbers와 정수 n이 매개변수로 주어집니다. numbers의 원소를 앞에서부터 하나씩 더하다가 그 합이 n보다 커지는 순간 이때까지 더했던 원소들의 합을 return 하는 solution 함수를 작성해 주세요.

문제 해설

n보다 커지는 순간 바로 return하면 된다. for문과 if문을 같이 사용.

 

정답

class Solution {
    public int solution(int[] numbers, int n) {
        int answer = 0;
        
        for(int i = 0; i < numbers.length; i++) {
            answer += numbers[i];
            if(answer > n) {
                return answer;
            }
        }
        return answer;
    }
}

 

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

class Solution {
    public int solution(int[] numbers, int n) {
        int answer = 0;

        for(int i = 0; answer <= n; i++) {
            answer += numbers[i];
        }

        return answer;
    }
}

 

다만 안정적으로는 위쪽이 더 낫다. answer이 n을 넘어서는 순간 바로 return하여 연산을 끊기 때문이다. 아래는 i가 끝나지 않기 때문에, i 제약조건을 넣거나 하는게 낫다.

 


수열과 구간 쿼리 1

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e] 꼴입니다.

각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 arr[i]에 1을 더합니다.

위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

 

문제 해설

과거에 있던 구간 쿼리들을 생각하며 풀면 된다.

 

정답

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int s = 0, e = 1;
        
        for(int i = 0; i < queries.length; i++){
            s = queries[i][0];
            e = queries[i][1];
            
              for(int j = s; j <= e; j++) {
                  arr[j]++;
              }
        }
        
        return arr;
    }
}

 

가장 많은 좋아요를 받은 것과 거의 비슷하다. 다만 s와 i는 for문 안에서 초기화해도 괜찮다.