새소식

Programmers Coding Test/Java

[프로그래머스 120864] Java - 코딩테스트 입문 / 숨어있는 숫자의 덧셈(2)

  • -

숨어있는 숫자의 덧셈(2)

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120864

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

1)  문제

문자열 my_string이 매개변수로 주어집니다. 
my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. 
my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_string의 길이 ≤ 1,000
1 ≤ my_string 안의 자연수 ≤ 1000
연속된 수는 하나의 숫자로 간주합니다.
000123과 같이 0이 선행하는 경우는 없습니다.
문자열에 자연수가 없는 경우 0을 return 해주세요.

 

 

 

2)  예시

 

 

Result Table
my_string result
"aAb1B2cC34oOp" 37
"1a2b3c4d123Z" 133

 

 

입출력 예 #1
"aAb1B2cC34oOp"안의 자연수는 1, 2, 34 입니다. 따라서 1 + 2 + 34 = 37 을 return합니다.


입출력 예 #2
"1a2b3c4d123Z"안의 자연수는 1, 2, 3, 4, 123 입니다. 따라서 1 + 2 + 3 + 4 + 123 = 133 을 return합니다.

 

 

 

 

3)  풀이

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 문자열 my_string을 매개변수로 하는 solution 메소드를 선언합니다.

solution은 정수를 반환하므로 데이터타입을 int으로 합니다.

●   public int solution(String my_string) {

 

 

3. 모든 값을 더한 것을 정수 sum으로 정의하고, 0으로 초기화 시킵니다.

Stringbuilder를 이용하여 가변문자객체 number를 생성해줍니다.

●      int sum = 0;
        StringBuilder number = new StringBuilder();
        

 

 

4. for문을 통해 my_string 문자열을 순회합니다.

c 문자는 my_string의 i번째 입니다.

이 c가 자연수인지 아니면 알파벳인지를 구분하여 더할지 안더할지를 결정하게 됩니다.

●  for (int i = 0; i < my_string.length(); i++) {
            char c = my_string.charAt(i);

 

 

 

 

5. c가 숫자인지 아닌지는 Character 클래스의 정적메소드 isDigit을 이용해줍니다.

if구문을 이용하여 c가 숫자일 경우, number에 c를 더해줍니다.

그렇지 않을 경우(문자가 나타났을 경우),

number의 길이가 0보다 길다면, number를 문자열로 형변환 후, 정수로 변환하여 sum에 더해줍니다.

그런 다음, number를 0으로 초기화시킵니다.

●  if (Character.isDigit(c)) {
                number.append(c);
            } else {
                if (number.length() > 0) {
                    sum += Integer.parseInt(number.toString());
                    number.setLength(0);
                }
            }
        }

 

 

 

 

 

5. 그리고 모든 for문 순회가 끝났는데 number가 남아있을 수 있습니다. (my_string의 마지막 문자가 숫자일 경우)

그 경우를 대비하여 sum에 number를 더해주는 작업을 마지막에 또 해줍니다.

최종적으로 sum을 return해줍니다.

●            if (number.length() > 0) {
            sum += Integer.parseInt(number.toString());
        }

        return sum;
    }

}

 

 

 

 

4)  코드

 

public class Solution {
    public int solution(String my_string) {
        int sum = 0;
        StringBuilder number = new StringBuilder();

        for (int i = 0; i < my_string.length(); i++) {
            char c = my_string.charAt(i);

            if (Character.isDigit(c)) {
                number.append(c);
            } else {
                if (number.length() > 0) {
                    sum += Integer.parseInt(number.toString());
                    number.setLength(0);
                }
            }
        }

        
        if (number.length() > 0) {
            sum += Integer.parseInt(number.toString());
        }

        return sum;
    }

}

 

 

 

 

 

 

 

 

5)  느낀점

 

 

가변객체 StringBuilder를 이용했는데 불변객체 String을 이용한다면 코드가 어떻게 바뀔까.

라는 생각에 코드를 짜봤습니다.

public class Solution {
    public int solution(String my_string) {
        int sum = 0;
        String number = "";

        for (int i = 0; i < my_string.length(); i++) {
            char c = my_string.charAt(i);

            if (Character.isDigit(c)) {
                number += c; 
                // 문자열을 추가할 때마다 새로운 객체 생성
            } else {
                if (!number.isEmpty()) {
                    sum += Integer.parseInt(number);
                    number = "";  
                    // 새로운 문자열 객체 생성
                }
            }
        }

        if (!number.isEmpty()) {
            sum += Integer.parseInt(number);
        }

        return sum;
    }
}

 

String을 이용한다면,

문자열을 변경 및 추가할 때마다 새로운 객체를 생성하기 때문에 성능 및 메모리 저하를 일으킬 수 있습니다. 

 

StringBuilder 사용

 

 

 

String 사용

 

 

String을 이용했을 경우, 속도차이가 엄청난 것을 확인할 수 있었습니다.

좀 더 효율적인 방안으로 문제를 해결했다는 점에서 만족스러웠습니다.

 

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.