코딩테스트 회고록/코테_Java

[JAVA] 프로그래머스 - 숨어있는 숫자의 덧셈 (1)

iamjisu 2023. 3. 29. 20:17

프로그래머스 코딩테스트 연습 입문단계 '숨어있는 숫자의 덧셈(1)' 문제입니다.

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

 

프로그래머스

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

programmers.co.kr


❓ 문제 설명

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

 

※ 아래 입출력 예시를 참고하세요!


⚠️ 제한사항 및 입출력 예시

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

 

입력 (my_string)

"aAb1B2cC34oOp"

출력 (return 값)

10

// "aAb1B2cC34oOp"안의 한자리 자연수는 1, 2, 3, 4
// 따라서 1 + 2 + 3 + 4 = 10 을 return합니다.

🔍 알고리즘 구상

  1. charAt() 메서드로 문자열을 자른다
  2. 자른 문자열을 숫자의 아스키코드 값과 비교한다
  3. 숫자가 맞다면 '0'을 빼서 원하는 숫자값을 누적한다.

'0'의 아스키코드는 48고 '9'의 아스키코드는 57로 0을 빼면 한 자리 숫자가 나온다.

ex) 문자 '7'을 정수값으로 바꾸고 싶을 때 ▶ '7' - '0' = 55 - 48 = 7


✏️ 직접 구현한 코드

import java.util.*;

class Solution {
    public int solution(String my_string) {
        int answer = 0;
        for(int i = 0; i < my_string.length(); i++) {
            char c = my_string.charAt(i);
            if((int)c >= 48 && (int)c <= 57)
                answer += c-'0';
        }
        return answer;
    }
}

🗣️ 코드 설명

  1. 문자열안에 숫자값을 찾아 누적할 answer을 생성했습니다.
  2. 0부터 my_string의 길이보다 작을 때까지 증가하는 i 를 증가값으로 가진 for문을 만듭니다
  3. for문 안에서는 charAt() 메서드를 이용해 my_string의 i 번째 문자를 c에 저장합니다.
  4. c에 저장한 뒤 if문을 이용해 그 문자가 숫자인지 알아냅니다. c를 int형으로 강제형변환하면 아스키코드로 변환되는데 이때 이 아스키코드가 숫자의 아스키코드(48~57)이라면 answer에 c에서 '0'을 뺀 값을 누적해 더합니다.

🔥 다른 사람의 코드

1. 그냥 char타입도 비교가 된다

class Solution {
    public int solution(String my_string) {
        int answer = 0;

        for(char c : my_string.toCharArray()){
            if(c >= '0' && c <= '9'){
                answer += c - '0';
            }
        }
        return answer;
    }
}

저는 char타입을 int타입으로 강제형변환해서 비교했는데, char타입은 그냥 비교가 되네요!

그리고 이 분은 for문이 아니라 for each문을 사용했습니다.

 

 

2.  replaceAll() 사용

class Solution {
    public int solution(String my_string) {
        int answer = 0;
        String str = my_string.replaceAll("[^0-9]","");

        for(char ch : str.toCharArray()) {
            answer += Character.getNumericValue(ch);
        }

        return answer;
    }
}

이 분은 replaceAll() 메서드를 사용해서 0부터 9가 아니라면 공백으로 채웠습니다.

Character 클래스의 getNumericValue() 메서드를 사용해 char타입을 int타입으로 변환시켰네요!!


⭐ 기억하고 넘어갈

 

  •  char타입을 그냥 비교할 수 있다 

 

  •  Character 클래스의 getNumericValue() 메서드  : char타입을 int타입으로 변환한다
// import java.lang.Character

char c = '8';

int num = Character.getNumericValue(c);
// num = 8

 

Character의 API ▼

https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/Character.html#getNumericValue(int) 

 

Character (Java SE 15 & JDK 15)

All Implemented Interfaces: Serializable, Comparable , Constable public final class Character extends Object implements Serializable, Comparable , Constable The Character class wraps a value of the primitive type char in an object. An object of class Chara

docs.oracle.com