[프로그래머스][코딩테스트 연습][Java] 문자열을 정수로 바꾸기 / length(), charAt(), Character.getNumericValue(), Integer.parseInt()

2024. 9. 19. 14:59·💻 Code Kata/Algorithm

📖 문제

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

⛔ 제한 조건

  • s의 길이는 1 이상 5 이하입니다.
  • s의 맨 앞에는 부호(+, -)가 올 수 있습니다.
  • s는 부호와 숫자로만 이루어져 있습니다.
  • s는 "0"으로 시작하지 않습니다.

💻 입출력 예

예를 들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.


 • String의 특성

String은 char의 배열이므로, 배열처럼 사용해도 될 것이라고 생각했습니다.

하지만 String은 다양한 메서드로 문자열을 조작하고 접근할 수 있도록 설계된 객체입니다.

직접 배열 인덱스를 사용할 수 없고, charAt() 메서드를 사용해서 특정 인덱스의 문자에 접근해야 합니다.

s[i]와 같은 배열 인덱스 접근은 컴파일 오류를 발생시킵니다.

class Solution {
    public int solution(String s) {
        int answer = 0;
        for (int i = 1; i < s.length; i++) {
            if (s[0] == '+') {
                answer = s[i] * (10 ^ (s.length - 1 - i));
            } else {
                answer = (-1) * s[i] * (10 ^ (s.length - 1 - i));
            }
        }
        return answer;
    }
}

 • 첫 번째 오류

첫 번재 오류 메시지 (1)
첫 번재 오류 메시지 (2)

 

 

 • 오류 발생 원인 및 해결 방안

 1) 문자열에서 길이를 조회할 때, length가 아닌 length() 메서드를 이용합니다.

      문자열(String)에서 길이값을 확인할 때, length() 메서드를 이용합니다.

🔎 length vs length() vs size()
: 길이값 가져오기

1. length
 • arrays(int[], double[], String[])
 • length는 배열의 길이를 조회합니다.

2. length()
 • String related Object(String, StringBuilder etc)
 • length()는 문자열의 길이를 조회합니다. (ex. “ABCDE”.length() == 5)

3. size()
 • Collection Object(ArrayList, Set etc)
 • size()는 컬렉션 타입 목록의 길이를 조회합니다.

 

 

 2) String은 다양한 메서드로 문자열을 조작하고 접근할 수 있도록 설계된 객체로, 배열의 인덱스를 직접 사용할 수 없고 `charAt()` 메서드를 사용해서 특정 인덱스의 문자에 접근해야 합니다.

    배열 인덱스로의 접근은 컴파일 오류를 발생시킵니다.

 

 

  • 수정 코드

class Solution {
    public int solution(String s) {
        int answer = 0;
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(0) == '+') {
                answer = s.charAt(i) * (10 ^ (s.length() - 1 - i));
            } else {
                answer = (-1) * s.charAt(i) * (10 ^ (s.length() - 1 - i));
            }
        }
        return answer;
    }
}

 • 두 번째 문제 발생

테스트 실패 결과 창

 

  • 문제 발생 원인

  1. 문자열의 맨 앞에는 부호'만' 올 수 있는 것이 아니라, 부호'도' 올 수 있는 것입니다.
    → 맨 앞에 부호가 아닌 숫자가 오는 경우도 고려해줘야 합니다.
  2. for문에서 각 자리의 값들이 누적 처리되어야 합니다.
  3. charAt() 메서드를 사용하여 읽어온 값은 숫자형이 아닌 문자형 char입니다.
    → 숫자형으로 변환해줘야 합니다.

 

  • 두 가지 해결 방안

 1) ASCII code를 사용하여, char형을 int형으로 변환시켜줍니다.

 2) Character.getNumericValue() 메서드를 이용하여, 숫자 형태의 char형을 int형으로 변환시켜줍니다.

 2) 문자열을 숫자형으로 한 번에 변환시켜주는 메서드를 사용합니다.


  1) ASCII code를 사용하여, char형을 int형으로 변환

class Solution {
    public int solution(String s) {
        int answer = 0;
        int sign = 0;	// 부호를 저장하는 변수; -1, 1
        int num = 0;	// 값을 저장하는 변수

        for (int i = 0; i < s.length(); i++) {
        	/* 부호 처리 과정 */
            if (i == 0) {
            	// 문자열의 맨 앞에 부호가 있는 경우
                if (s.charAt(0) == '-') {
                    sign = -1;
                } else if (s.charAt(0) == '+') {
                    sign = 1;
                }
                // 문자열의 맨 앞에 부호가 없는 경우; 양수
                else {
                    sign = 1;
                    num = (s.charAt(i) - '0') * (10 ^ (s.length() - 1));
                }
            }
            /* 값 처리 과정 */
            else {
                num += (s.charAt(i) - '0') * (10 ^ (s.length() - 1 - i));
            }
            
            System.out.println(sign + ", " + num + " "); // 올바른 값으로 실행되었는지 출력
        }
        
        answer = sign * num;
        return answer;
    }
}

 

 • 문제 발생 (1)

 

  • 문제 발생 원인 및 해결 방안

 : `^`는 비트 XOR 연산으로, Java에서 제곱 연산을 할 때는 Math.pow() 메서드를 이용해야 합니다.

• Math.pow() 메서드
public static double Math.pow(double base, double exponent)

 

  • 수정 코드

class Solution {
    public int solution(String s) {
        int answer = 0;
        int sign = 0;	// 부호를 저장하는 변수; -1, 1
        int num = 0;	// 값을 저장하는 변수

        for (int i = 0; i < s.length(); i++) {
        	/* 부호 처리 과정 */
            if (i == 0) {
            	// 문자열의 맨 앞에 부호가 있는 경우
                if (s.charAt(0) == '-') {
                    sign = -1;
                } else if (s.charAt(0) == '+') {
                    sign = 1;
                }
                // 문자열의 맨 앞에 부호가 없는 경우; 양수
                else {
                    sign = 1;
                    num = (s.charAt(i) - '0') * Math.pow(10, s.length() - 1);
                }
            }
            /* 값 처리 과정 */
            else {
                num += (s.charAt(i) - '0') * Math.pow(10, s.length() - 1 - i);
            }
            
            System.out.println(sign + ", " + num + " "); // 올바른 값으로 실행되었는지 출력
        }
        answer = sign * num;
        return answer;
    }
}

 

• 문제 발생 (2)

 

  • 발생 원인 및 해결 방안

 : Math.pow() 값은 double형으로 반환됩니다.

  제한 조건에 의해 int형으로도 충분히 값 손실이 잃어나지 않게 연산이 가능하므로 강제 형변환을 해줍니다.

 

  • 수정 코드

class Solution {
    public int solution(String s) {
        int answer = 0;
        int sign = 0;
        int num = 0;

        for (int i = 0; i < s.length(); i++) {
        	/* 부호 처리 과정 */
            if (i == 0) {
            	// 문자열의 맨 앞에 부호가 있는 경우
                if (s.charAt(0) == '-') {
                    sign = -1;
                } else if (s.charAt(0) == '+') {
                    sign = 1;
                }
                // 문자열의 맨 앞에 부호가 없는 경우; 양수
                else {
                    sign = 1;
                    num = (s.charAt(i) - '0') * (int) Math.pow(10, s.length() - 1);
                }
            }
            /* 값 처리 과정 */
            else {
                num += (s.charAt(i) - '0') * (int) Math.pow(10, s.length() - 1 - i);
            }
        }
        answer = sign * num;
        return answer;
    }
}

 

 

  2) Character.getNumericValue() 메서드 - 숫자 형태의 char형을 int형으로 변환

🔎 문자형 char 타입의 숫자를 int형으로 변환시켜주는 메서드
      Character.getNumericValue() 메서드
public static int Character.getNumericValue(char ch)
class Solution {
    public int solution(String s) {
        int answer = 0;
        int sign = 0;
        int num = 0;

        for (int i = 0; i < s.length(); i++) {
            if (i == 0) {
                if (s.charAt(0) == '-') {
                    sign = -1;
                } else if (s.charAt(0) == '+') {
                    sign = 1;
                } else {
                    sign = 1;
                    num = Character.getNumericValue(s.charAt(i)) * (int) Math.pow(10, s.length() - 1);
                }
            } else {
                num += Character.getNumericValue(s.charAt(i)) * (int) Math.pow(10, s.length() - 1 - i);
            }
        }
        answer = sign * num;
        return answer;
    }
}

 

 

  3) Integer.parseInt() - 문자열을 숫자형으로 변환하는 메서드

🔎 문자열 String 타입의 숫자를 숫자형 타입으로 변환시켜주는 메서드

Byte.parseByte()
Short.parseShort()
Integer.parseInt()
Long.parseLong()
Float.parseFloat()
Double.parseDouble()
class Solution {
    public int solution(String s) {
        int answer = 0;
        
        answer = Integer.parseInt(s);
        return answer;
    }
}

 

 


 • TIL

 

 1. length vs length() vs size()

  : 길이값 가져오기

 1) length

  • arrays(int[], double[], String[])
  • length는 배열의 길이를 조회합니다.

 2) length()

  • String related Object(String, StringBuilder etc)
  • length()는 문자열의 길이를 조회합니다. (ex. “ABCDE”.length() == 5)

 3) size()

  • Collection Object(ArrayList, Set etc)
  • size()는 컬렉션 타입 목록의 길이를 조회합니다.

 2. String 클래스

String은 다양한 메서드로 문자열을 조작하고 접근할 수 있도록 설계된 객체입니다.

직접 배열 인덱스를 사용할 수 없고, charAt() 메서드를 사용해서 특정 인덱스의 문자에 접근해야 합니다.

s[i]와 같은 배열 인덱스 접근은 컴파일 오류를 발생시킵니다.


 

[주요 메서드]

 1) 문자 접근 및 변환

  • charAt(int index): 해당 인덱스에 위치한 문자 반환
  • length(): 문자열의 길이 반환
  • substring(int beginIndex): 지정된 인덱스부터 끝까지의 부분 문자열 반환
  • substring(int beginIndex, int endIndex): 주어진 인덱스 범위의 부분 문자열 반환
  • toCharArray(): 문자열을 char 배열로 변환

 2) 검색 및 비교

  • indexOf(String str): 주어진 문자열이 처음 나타나는 인덱스 반환
  • lastIndexOf(String str): 주어진 문자열이 마지막으로 나타나는 인덱스 반환
  • equals(Object obj): 두 문자열의 내용이 같은지 비교
  • equalsIgnoreCase(String anotherString): 대소문자를 무시하고 비교

 3) 변환 및 조작

  • toLowerCase(): 문자열을 소문자로 변환
  • toUpperCase(): 문자열을 대문자로 변환
  • trim(): 문자열의 앞과 뒤의 공백 제거
  • replace(char oldChar, char newChar): 특정 문자를 다른 문자로 교체
  • replaceAll(String regex, String replacement): 정규 표현식에 따라 문자열을 교체

 4) 형식화

  • format(String format, Object... args): 형식화된 문자열 생성

 5) 기타

  • split(String regex): 주어진 정규 표현식에 따라 문자열을 나누어 배열로 반환
  • contains(CharSequence sequence): 특정 문자열이 포함되어 있는지 확인

 3. Math.pow() 메서드

public static double Math.pow(double base, double exponent)

 4. Character.getNumericValue() 메서드

public static int Character.getNumericValue(char ch)

 5. Integer.parseInt() 메서드

public static int Integer.parseInt(String s)

 

 

저작자표시 비영리 변경금지 (새창열림)

'💻 Code Kata > Algorithm' 카테고리의 다른 글

[프로그래머스][코딩테스트 연습][Java] 약수의 합 / 약수 구하기  (0) 2024.09.06
[프로그래머스][코딩테스트 연습][Java] 평균 구하기 / length, length(), size() 의 차이점  (0) 2024.09.05
[프로그래머스][코딩테스트 연습][Java] 짝수와 홀수 / 음수의 나눗셈 처리  (1) 2024.09.05
'💻 Code Kata/Algorithm' 카테고리의 다른 글
  • [프로그래머스][코딩테스트 연습][Java] 약수의 합 / 약수 구하기
  • [프로그래머스][코딩테스트 연습][Java] 평균 구하기 / length, length(), size() 의 차이점
  • [프로그래머스][코딩테스트 연습][Java] 짝수와 홀수 / 음수의 나눗셈 처리
레이제로
레이제로
  • 레이제로
    한 걸음
    레이제로
  • 전체
    오늘
    어제
    • 분류 전체보기 (11)
      • ✍🏻 TIL (4)
        • 혼자 공부하는 컴퓨터 구조+운영체제 (4)
      • ✏ Study (3)
        • Problem Solving (1)
        • Spring (0)
        • Java (2)
        • Data Structure (0)
        • Algorithm (0)
      • 💻 Code Kata (4)
        • Algorithm (4)
        • SQL (0)
      • 📃etc. (0)
        • JS (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 개발 공부 외 이모저모
  • 공지사항

  • 인기 글

  • 태그

    음수
    나눗셈
    코드카타
    length
    length()
    OOP
    나머지
    size()
    Solid 원칙
    FastIO
    java
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
레이제로
[프로그래머스][코딩테스트 연습][Java] 문자열을 정수로 바꾸기 / length(), charAt(), Character.getNumericValue(), Integer.parseInt()
상단으로

티스토리툴바