본문 바로가기

컴퓨터 프로그래밍/알고리즘

[프로그래머스] Lv0. 문자열 뒤집기/배열자르기/정수의 합

문제 

문자열 my_string이 매개변수로 주어집니다. 
my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.

답안 예시 : my_string = 'apple' -> 결과값 : elppa이 나와야 함
class Solution {
    public String solution(String my_string) {
    
        StringBuilder sb = new StringBuilder(my_string);
        String reversedStr = sb.reverse().toString();
        
        return reversedStr;
    }
}

 

💻 [ 내가 짠 코드 분석 ]

해당 문제는 문자열에 관련된 함수가 어떤게 있는지 알아보기 위한 문제였다. 

문자열을 뒤집기 위해 StringBuilder를 사용할 수 있다. 

본디 String 문자열 객체는 변경 불가능하다. 한 번 생성되면 내용을 바꿀 수 없다.

But, StringBuilder변경 가능한 문자열을 만들어 주기 때문에, String을 합치는 작업 시 하나의 대안이 될 수 있다.

 

매개변수로 받은 my_string값을 StringBuilder객체에 담아주게 되면 변경 가능한 문자열이 되는 것이다. 

StringBuilder객체인 sb.reverse()함수를 사용하면 문자열을 뒤집어 새로운 String값을 뽑아 낼 수 있고, 값을 뽑을 때에는 반드시 toString()을 붙여 String형 변환을 해주어야한다, String 변수에 넣을 때도 마찬가지다.

 

※ toString()은 명시적으로 호출하기 보다는 문자열과 합칠 때 자동 변환 용도로 더 많이 사용됨.

사용자 정의 클래스의 인스턴스 역시 Object 타입을 상속하기 때문에 따로 정의하지 않아도 toString() 메서드가 정의되어 있다. 당연히 Object에 있는 것과 같은 것!!

 

■ 문제

정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 
num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.
import java.util.Arrays;

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int[] answer = new int[num2];
         
        answer = Arrays.copyOfRange(numbers, num1, num2+1);
        
        return answer;
    }
}

 

💻 [ 내가 짠 코드 분석 ]

 

 

해당 문제의 핵심은 배열 자르는 방법을 구현해내는 것이었다. 

실제 배열을 자르기 보다 기존 배열을 복사하여 복사한 배열을 결과 값으로 보여주는 것이 방법!

우선 원하는 배열의 길이 만큼 자르기 위해서는 아래와 같은 두 가지 방법이 있다.

 

1.Arrays.copyOfRange() 의 사용 방법 : Arrays.copyOfRange(배열, 시작점, 끝점)

여기서 주의할 점은 끝점을 포함하지 않고 이전까지만 배열의 복사가 이루어 진다.

 

2.System.arraycopy()의 사용 방법 : System.arraycopy(배열, 복사시작점, 복사후배열, 복사끝점, 복사할 배열의 length)

 

■ 문제

정수 n이 매개변수로 주어질 때 
n의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요
import java.util.ArrayList;

class Solution {
    public int solution(int n) {
        ArrayList<Integer> alist = new ArrayList<Integer>();
        int result = 0;
        
        while(n > 0){
            //나머지 
            alist.add(n%10);
            //몫
            n = n/10;
        }
        
        for(int i:alist){
            result += i;
        }
        
        return result;
    }
}

 

💻 [ 내가 짠 코드 분석 ]

 

해당 코드는 정수의 몫과 나머지를 이용하여 각자리의 값을 합한 결과를 도출해내는 과정이 중요했다고 생각한다. 

이번에는 ArrayList를 사용하여 파라미터 값으로 받은 정수 n을 % 10 으로 나누게 되면 나머지 값이 해당 정수의 자리 수를 의미하게 된다. n / 10은 몫으로서 계속해서 나누어야 할 값을 남겨두게 된다. 

 

ArrayList에 값을 추가하려면 .add() 메소드를 사용해서 값을 추가하면 되고, 마지막 향상된 for문을 돌려 ArrayList에 추가 된 값들을 하나하나 씩 더해주어 마지막 result결과 값을 도출해내면 끝!!

 

알고리즘은 확실히 문제를 많이 접해보고 풀어봐야 원리에 대한 이해가 쉽게 되는 것 같다.