[Java 알고리즘] 알고리즘 전략과 charAt(), substring() 함수 활용 문제풀이, String 형인 숫자를 int형으로 변경 방법, StringBuilder 사용이유

    알고리즘 전략

    1. 문제를 정확히 이해한다.(먼저 문제를 보고 시각화하여 어떻게 풀건지 말로 설명할 수 있어야 한다.)

    2. 생각하고 프로그램화 한다. 즉 한국말로 생각하면서 이미지화 하고 Java로 코딩해야 한다.

    3. 담을 그릇을 만든다 (Data Structure)

    4. for(), while문을 만들고 그 안에 알고리즘을 담는다.

     

    문제 : 숫자인 String 문자열 2개를 더한값 출력

    Input: "123", "888"
    Output: "1011"
    package codingtest_java;
     
    // charAt(), subString(), StringBuilder클래스, append(), reverse().toString()
    // String인 숫자값을 숫자로 변환 int num = str.charAt(i) - '0'
    public class CharAtExaple {
        public static void main(String[] args) {
            String num1 = "123";
            String num2 = "888";
     
            System.out.println(new CharAtExaple().solve(num1, num2));
        }
     
        public String solve(String num1, String num2) {
            // StringBuffer는 동기화를 지원하여 멀티쓰레드시 사용
            // StringBuilder는 동기화를 지원안하여 단일쓰레드시 성능 우수함.
            StringBuilder sb = new StringBuilder();
     
            int num1Length = num1.length()-1, num2Length = num2.length()-1;
            int carry = 0;
     
            while(num1Length >= 0 || num2Length >= 0) {
                int n1=0, n2=0, sum=0;
                n1 = num1.charAt(num1Length) - '0';
                n2 = num2.charAt(num2Length) - '0';
     
                sum = carry + n1 + n2;
                carry = sum / 10;
     
                sb.append(sum % 10);
     
                num1Length--;
                num2Length--;
            }
            if(carry != 0) sb.append(carry);
     
            return sb.reverse().toString();
        }
    }
     
     
    cs

     

    StringBuilder를 사용한 이유는 반환해야할 String값이 계속 변환해서 만들어지기 때문이다. String은 변하지 않는 값인데 변환이 필요할때마다 String 객체가 새로 생성되어야 한다. 그래서 Buffer를 사용하여 변할수 있는 String 객체로 StringBuilder와 StringBuffer가 있는데 두개의 큰 차이는 동기화지원이다. StringBuffer는 동기화가 지원돼서 한 객체를 여러 스레드에서 사용할때 안전하다. 이것을 Thread-safety 라고 한다. 하지만 다소 무거운 객체 가 되기때문에 여러 스레드에서 사용되지 않는다면 다소 가벼운 StringBuilder를 사용하는 것이 좋다. 그래서 위 코딩에서 StringBuilder를 사용하였다. 

     

    charAt(인덱스) 함수는 문자열에서 인덱스에 해당되는 값을 가져온다. ex) "str".charAt(0) -> "s"

     

    더하고 빼고 하려면 문자열이 아닌 숫자형이여야 하기 때문에 문자열을 숫자로 변경해줘야 한다. 그것은 "문자열숫자" -'0' 을 해주면 된다. 

     

    append()함수는 StringBuilder객체에 문자열을 더할때 사용되고, reverse()는 문자열을 반대로 뒤집는다. 

    ex) abc -> cba 

     

    [참고]

    인프런 강의 / 코딩테스트 전 꼭 알아야 할 개념과 문제(with 자바) / 푸샵맨 코딩스터디 

    https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html

     

    댓글

    Designed by JB FACTORY