[코딩 테스트 RUN] 코딩 기초 트레이닝 21일차: 함수(메서드)

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

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

 

 

이제 4일만 남았다.

완전히 초기로직에는 익숙해져서, 곧 레벨 1로 완전히 넘어갈 일도 머지 않은 듯하다.

이번 문제는 쉬웠지만 단 하나가 내 발목을 잡았다.

 

뒤에서 5등 위로

정수로 이루어진 리스트 num_list가 주어집니다. num_list에서 가장 작은 5개의 수를 제외한 수들을 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

문제 해설

이전 뒤에서 5등까지와 비슷하지만 다른 문제.

저번에는 copyOf만 사용했다면 이번에는 copyOfRange를 사용해서 5의 index부터 잘랐다.

 

 

정답

import java.util.*;

class Solution {
    public int[] solution(int[] num_list) {
        Arrays.sort(num_list);

        int[] answer = Arrays.copyOfRange(num_list, 5, num_list.length);
    
        return answer;
    }
}

 

for문 사용보다 쉽고 알기 편하다.

 


전국 대회 선발 고사

0번부터 n - 1번까지 n명의 학생 중 3명을 선발하는 전국 대회 선발 고사를 보았습니다. 등수가 높은 3명을 선발해야 하지만, 개인 사정으로 전국 대회에 참여하지 못하는 학생들이 있어 참여가 가능한 학생 중 등수가 높은 3명을 선발하기로 했습니다.

각 학생들의 선발 고사 등수를 담은 정수 배열 rank와 전국 대회 참여 가능 여부가 담긴 boolean 배열 attendance가 매개변수로 주어집니다. 전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번이라고 할 때 10000 × a + 100 × b + c를 return 하는 solution 함수를 작성해 주세요.

 

문제 해설

맞혔지만 찝찝한 문제.

.sort 메서드를 잘 몰라서 i의 값에 대한 저장에 대해서 고민을 했다.

그 결과가 HashMap. 접근 방법 자체는 나쁘지 않았다. 저장하는 건 rank[i]를 key로, i를 value로 잡았다.

sort는 어떻게 해야할지 모르겠어서 ArrayList를 사용했다.

 

여기서 아직 모자람을 깨달았다.

 

정답

import java.util.*;

class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        HashMap <Integer, Integer> map = new HashMap <Integer, Integer>();
        ArrayList<Integer> list = new ArrayList<>();
        
        for(int i = 0; i < rank.length; i++) {
            if(attendance[i]) {
                map.put(rank[i],i);
                list.add(rank[i]);
            }
        }
    
        Collections.sort(list);
        int answer = map.get(list.get(0)) * 10000 + map.get(list.get(1)) * 100 + map.get(list.get(2));
        
        return answer;
    }
}

 

이것은 여러가지 풀이 방법이 있는데, 가장 낫다고 판단한 방법을 가져온다.

 

import java.util.*;

class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < rank.length; i++) {
            if (attendance[i]) {
                list.add(i);
            }
        }

        list.sort((a, b) -> rank[a] - rank[b]);

        int a = list.get(0);
        int b = list.get(1);
        int c = list.get(2);

        return 10000 * a + 100 * b + c;
    }
}

 

List와 ArrayList만 사용한 방법. 저장은 i값만 하고,

.sort를 사용했다. list.sort는 a와 b를 비교해서 더 작은 a를 앞에 두는 방법이다.

js에서는 간간이 썼는데, java에서도 쓸 수 있을줄 몰랐다.

 

 


정수 부분

실수 flo가 매개 변수로 주어질 때, flo의 정수 부분을 return하도록 solution 함수를 완성해주세요.

 

문제 해설

21일차에서 만나기에는 아쉬운 문제.

Math.floor해서 잘라버렸지만 생각해보면 그냥 형변환하면 되는 일이다.

 

 

정답

class Solution {
    public int solution(double flo) {
        int answer = (int)Math.floor(flo);
        return answer;
    }
}

 

이걸로 제출했는데 생각해보니 그럴 필요도 없다.

class Solution {
    public int solution(double flo) {
        return (int) flo;
    }
}

 

이거면 된다.

 


문자열 정수의 합

한 자리 정수로 이루어진 문자열 num_str이 주어질 때, 각 자리수의 합을 return하도록 solution 함수를 완성해주세요.

 

문제 해설

마찬가지로 21일차에 만나기엔 아쉬운 문제. charAt으로 쪼개어서 정수변환한 뒤 += 하면 된다.

 

 

정답

class Solution {
    public int solution(String num_str) {
        int answer = 0;
        for(int i = 0; i < num_str.length(); i++) {
            answer += num_str.charAt(i) - '0';
        }
        return answer;
    }
}

 

split을 사용하는 방법도 있는데 이쪽이 훨씬 연산적으로 가볍다. 쪼개기를 생각하면 split을 보통 사용하는데, 특정 쪼개기 문자가 없으면 솔직히 charAt쪽이 훨씬 속도와 메모리에서 월등하다.

 


문자열을 정수로 변환하기

숫자로만 이루어진 문자열 n_str이 주어질 때, n_str을 정수로 변환하여 return하도록 solution 함수를 완성해주세요.

 

문제 해설

그냥 Integer.parseInt로 해결하면 되는 일이다.

 

정답

class Solution {
    public int solution(String n_str) {
        return Integer.parseInt(n_str);
    }
}