본문 바로가기
코딩테스트/프로그래머스 Lv.0

[문제] 숨어있는 숫자의 덧셈 (1)

by moca7 2024. 10. 10.

 

 

ㅁ 문제

 

문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

 

 

 

ㅁ 제한사항

 

  • 1 ≤ my_string의 길이 ≤ 1,000 
  • my_string은 소문자, 대문자 그리고 한자리 자연수로만 구성되어있습니다.

 

 

ㅁ 입출력 예

 

 

 

 

 

ㅁ 풀이

 

class Solution {
    public int solution(String my_string) {

        char[] cc = my_string.toCharArray();
        
        int sum = 0;
        
        for(int i=0; i<cc.length; i++){
            if( (cc[i] >= 65 && cc[i] <=90)  || (cc[i] >= 97 && cc[i] <= 122) ){
                
            }else{
                sum += Integer.parseInt(String.valueOf(cc[i]));
            }
        }
        
        return sum;
    }
}

 

 

- 문자열 my_string이 소문자, 대문자, 한자리 자연수로만 이루어져 있어서 아스키코드값으로 a~z, A~Z에 해당하지 않으면 전부 더해서 return하게 했다.

 

- 문제는 String을 char로 바꾸었는데, 모든 자연수의 합을 return해야함.

Integer.parseInt를 쓰려면 인자값으로 String만 와야 한다.

그래서 char형을 String.valueOf()로 String으로 바꿨다.

 

 

 

※ 유니코드 값 대신 문자 리터럴을 사용

 

if (cc[i] >= 65 && cc[i] <= 90) || (cc[i] >= 97 && cc[i] <= 122)
if ((cc[i] >= 'A' && cc[i] <= 'Z') || (cc[i] >= 'a' && cc[i] <= 'z'))


- if의 조건문 안에 유니코드 값을 쓰지 않고 문자 리터럴을 주면 편하고 더 직관적이다.

 

 

 

 

 

ㅁ 다른 풀이 (Integer.parseInt 메소드 미사용)

 

class Solution {
    public int solution(String my_string) {

        char[] cc = my_string.toCharArray();
        int sum = 0;
        
        for (int i = 0; i < cc.length; i++) {
            if (cc[i] >= '0' && cc[i] <= '9') {  // 숫자인지 확인
                sum += cc[i] - '0';  // '0'을 빼서 char를 숫자로 변환
            }
        }
        
        return sum;
    }
}

 

 

- cc[i] - '0': 문자에서 '0'의 ASCII 값을 빼면 실제 숫자가 됩니다. 예를 들어, '5' - '0'은 5가 됩니다.

- 문자 '5'가 있을 때, 이 문자의 유니코드 값은 53입니다. 여기서 '0'의 유니코드 값인 48을 빼면, 실제 숫자인 5가 됩니다.

 

 

  • '0'의 유니코드 값48입니다.
  • '1'의 유니코드 값49입니다.
  • '9'의 유니코드 값57입니다.

 

 

 

 

 

 

ㅁ 다른 풀이 ( Character.isLetter() & Character.isDigit() 메서드 사용 )

 

- Java에서 문자열을 다룰 때 종종 특정 문자 알파벳인지 숫자인지 여부를 판별해야 할 때가 있다.

이를 위해 자바는 유용한 메서드로 isLetter 메서드와 isDigit 메서드를 제공한다.

- 둘 다 Character 클래스에 정의되어 있다.

 

 

 

(1) isLetter 메소드

 

Character.isLetter(char ch);

 

- isLetter() 메서드는 특정 문자가 알파벳인지를 판별하여 true 또는 false를 반환한다.

 

 

char ch = 'A';
boolean isAlpha = Character.isLetter(ch);
System.out.println(isAlpha); // true

 

 

 

 

(2) isDigit 메소드

 

Character.isDigit(char ch);

 

- isDigit() 메서드는 특정 문자가 0부터 9까지의 숫자인지를 판별하여 true 또는 false를 반환합니다.

 

char ch = '5';
boolean isNumeric = Character.isDigit(ch);
System.out.println(isNumeric); // true

 

 

 

 

 

 

class Solution {
    public int solution(String my_string) {

        char[] cc = my_string.toCharArray();
        
        int sum = 0;
        
        for(int i=0; i<cc.length; i++){
            
            if(Character.isDigit(cc[i])){
                sum += cc[i];
            }
        }
        
        return sum;
    }
}

 

 

- 이렇게는 안 됨.

cc[i]는 char 값이며, 이 값은 숫자일 경우에도 ASCII 코드 값이다.

따라서 sum += cc[i];는 실제 숫자를 더하는 것이 아니라 문자 '0'(48)부터 '9'(57)의 ASCII 코드 값을 더하는 것이 된다.

 

 

 

class Solution {
    public int solution(String my_string) {

        char[] cc = my_string.toCharArray();
        
        int sum = 0;
        
        for(int i=0; i<cc.length; i++){
            
            if(Character.isDigit(cc[i])){
                sum += cc[i] - '0';
            }
        }
        
        return sum;
    }
}

 

 

- cc[i]의 아스키코드값이 아닌 실제 숫자값을 구하기 위해서 0을 뺄 때도, 그냥 0이아니라 문자 '0'을 빼야 한다.

 

 

'코딩테스트 > 프로그래머스 Lv.0' 카테고리의 다른 글

[문제] n의 배수 고르기  (0) 2024.10.10
[문제] 대문자와 소문자  (0) 2024.10.10
[문제] 문자 반복 출력하기  (0) 2024.10.10
[문제] 짝수는 싫어요  (0) 2024.10.10
[문제] 중앙값 구하기  (1) 2024.10.09