본문 바로가기

내일배움캠프/Today I Learned

[내배캠] 나의 열여섯번째 회고록

 

반복된 훈련으로 맷집을 키우자

 

 

알고리즘은 매일매일 꾸준하게 풀면서 깊이를 키워야 한다고 느꼈다. 

프로그래머스 문제들도 괜히 Lv0을 만들어 놓은게 아니구나 싶었다. 

Lv0에도 의도가 있다. 기본적인 수학적 사고를 넓혀주고, 문제의 의도를 파악할 수 있도록 훈련시켜 주는 것 같다. 

오늘은 부족한 부분을 채우고자 열심히 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결과 값을 도출해내면 끝!!

 

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