[코딩 테스트 RUN] 코딩 기초 트레이닝 22일차: 함수(메서드), 조건문 활용

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

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

 

 

강의 일지도 써야하는데 이것저것 하느랴 바쁘다.

슬슬 좀 더 나은 효율(연산적으로)을 찾기 시작했다. 메서드 사용은 적절하다 생각할 때만 사용하는 형태로 굳어지기로.

지난 차례에서 너무 복잡하게 풀려다가 이것저것을 안 덕분에 훨씬 나아졌다.

 

0 떼기

정수로 이루어진 문자열 n_str이 주어질 때, n_str의 가장 왼쪽에 처음으로 등장하는 0들을 뗀 문자열을 return하도록 solution 함수를 완성해주세요.

 

 

문제 해설

n_str에서 먼저 0이 아닌 index를 찾아서 substring으로 자른 뒤 break 해주면 된다.

혹은 return으로 바로 돌려줘도 괜찮고. 어차피 연산 중에 끊고, 크게 차이는 없긴 하다.

 

정답

class Solution {
    public String solution(String n_str) {
        String answer = "";
        
        for(int i = 0; i < n_str.length(); i++){
            char zero = n_str.charAt(i);
            if(zero != '0'){
                answer = n_str.substring(i);
                break;
            }
        }
        
        return answer;
    }
}

 

가장 많은 좋아요를 받은 건 사실 이것인데.

 

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

 

발상에 있어서는 좋지만 실 효율은 char 쪽이 더 좋은 편이다. 하지만 한줄로 끝낼 수 있다는 건 멋져보이니까…

 

두 코드의 연산속도 비교. 압도적으로 charAt쪽이 좋다.

 


두 수의 합

0 이상의 두 정수가 문자열 a, b로 주어질 때, a + b의 값을 문자열로 return 하는 solution 함수를 작성해 주세요.

 

문제 해설

처음에는 BigInteger를 사용해보았다. 그냥 int는 불가능하다. int의 byte를 넘어버리기 때문… 그래서 더 큰 byte를 가진 참조형 BigInteger를 사용할 수 있다. 이 방법이 제일 정석이긴하다.

import java.math.BigInteger;

class Solution {
    public String solution(String a, String b) {
        
        BigInteger A = new BigInteger(a);
        BigInteger B = new BigInteger(b);
        BigInteger sum = A.add(B);
        
        return sum.toString();
    }
}

 

다만 BigInteger의 연산속도가 다음과 같다.

 

 

크게 개의치 않을 수 있으나 연산 속도가 너무 느려서 다른 방법을 찾았다. 방법은 다음과 같다.

첫 번째로 StringBuilder를 사용한다. 나중에 toString 처리하면 된다.

그리고 제일 작은 자리 숫자부터 차례대로 sb에 append한다. a와 b의 length가 같다는 제한이 없는 것에 주의. 같은 index를 사용할 수 없으므로 i와 j라는 인덱스를 사용한다. 제일 작은 자리 숫자부터 시작하므로 length에서 1를 뺀 것이 시작 index가 된다. 따라서 charAt(i--) - '0' 하여 정수형이 된 숫자를 넣으면 되는데…

 

그렇다. 자릿수를 넘어가는 덧셈이 있는 것이다.

그러하여 실제로 연산은 어떻게 해서든 작은 자리 숫자부터 시작해야한다.

지난 차례에서 썼다고 생각했는데 없었다…풀어놓고 티스토리에 올리지 않은 문제가 하나 있는데, LV 1에서 자릿수 구하기라는 게 있다. 거기서는 자릿수를 %10으로 나누어서 구분한다. 그와 비슷하게 진행하면 된다.

일단 append에는 더한 값을 % 10해서 넣는다. 그리고 더한 값을 10으로 나눠서 남은 정수값이 있다면 그것이 위로 올라간다. 그렇게 하면 덧셈의 자릿수 문제도 해결된다.

 

작은 수부터 append했으니 reverse해서 뒤집어야 한다.

 

코드는 복잡할지언정 압도적인 연산속도를 자랑한다.

 

 

정답

class Solution {
    public String solution(String a, String b) {
        StringBuilder sb = new StringBuilder();
        
        int i = a.length() - 1, j = b.length() - 1;
        int rest = 0;
        
        while(i >= 0 || j >= 0 || rest > 0){
            int sum = rest;
            
            if(i >= 0) sum += a.charAt(i--) - '0';
            if(j >= 0) sum += b.charAt(j--) - '0';
            
            sb.append(sum % 10);
            rest = sum / 10;            
        }
        
        return sb.reverse().toString();
        
    }
}

 


문자열로 변환

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

 

문제 해설

할 말도 없다. Integer.toString 사용하면 된다.

 

정답

class Solution {
    public String solution(int n) {

        return Integer.toString(n);
    }
}

 

class Solution {
    public String solution(int n) {
        String answer = ""+n;
        return answer;
    }
}

 

이 방식도 있는데 별 차이는 없다. Integer.toString은 자주 사용하게 되므로 그냥 메서드를 외우는 게 낫다.

예전에는 이 방식을 꽤 썼는데 조금씩 줄여나가는 중이다. 그래도 쓸 일이 생기면 쓸 예정.

 

 

배열의 원소 삭제하기

정수 배열 arr과 delete_list가 있습니다. arr의 원소 중 delete_list의 원소를 모두 삭제하고 남은 원소들은 기존의 arr에 있던 순서를 유지한 배열을 return 하는 solution 함수를 작성해 주세요.

 

문제 해설

이번에는 ArrayList를 포함한 컬렉션 사용이 관건.

ArrayList에 내용을 추가하고, delete_list를 순회하면서 ArrayList를 remove했다. num의 경우 Integer.valueOf를 사용해서 정수를 Integer로 바꾸었다. 이렇게 해야지 컴파일러가 실행하면서 index와 혼동하지 않는다.

이후로는 Integer list를 int 배열로 바꾸는 작업.

 

 

정답

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[] delete_list) {
        ArrayList <Integer> list = new ArrayList<>();
        
        for(int num : arr){
            list.add(num);
        }
        
        for(int num : delete_list){
            list.remove(Integer.valueOf(num));
        }
        int[] answer = new int[list.size()];
        
        for(int i = 0; i < list.size(); i++){
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

 


부분 문자열인지 확인하기

부분 문자열이란 문자열에서 연속된 일부분에 해당하는 문자열을 의미합니다. 예를 들어, 문자열 "ana", "ban", "anana", "banana", "n"는 모두 문자열 "banana"의 부분 문자열이지만, "aaa", "bnana", "wxyz"는 모두 "banana"의 부분 문자열이 아닙니다.

문자열 my_string과 target이 매개변수로 주어질 때, target이 문자열 my_string의 부분 문자열이라면 1을, 아니라면 0을 return 하는 solution 함수를 작성해 주세요.

 

문제 해설

또 나온 바나나.

contains나 indexOf로 확인하면 된다. 연산속도는 둘 다 비슷하니 좀 더 짧은 contains 채용.

 

정답

class Solution {
    public int solution(String my_string, String target) {
        int answer = 0;
        
        if(my_string.contains(target)){
            answer = 1;
        }
        
        return answer;
    }
}

 

그냥 바로 return 처리해도 문제 없다.