컴공생의 발자취

[ 99클럽 코테 스터디 3일차 TIL ] 문자열에서 index 위치의 문자 반환 및 형변환 (char to int & String to Array) 본문

💡 코테/99클럽

[ 99클럽 코테 스터디 3일차 TIL ] 문자열에서 index 위치의 문자 반환 및 형변환 (char to int & String to Array)

MNY 2024. 3. 30. 23:49
728x90
반응형
💡 오늘의 학습 키워드

- charAt(int index)
- 형변환
    * char to int
    * String to Array

 

charAt(int index)

: 문자열에서 해당 index 위치의 문자를 반환해주는 함수이다.

String str = "Hello";
System.out.println(str.charAt(1));

// result : e

 

형변환

1. char to int : 문자를 숫자로 변환하기

  • '0'을 빼주기 ( ASCII code 사용 )
char c = '1';
int n = c - '0';
System.out.println(n); 

// result : 1

 

  • Character.getNumericValue( char c )
char c = '1';
int n = Character.getNumericValue(c);
System.out.println(n); 

// result : 1

 

2. String to Array : 문자열을 배열로 변환하기

  • 반복문
String str = "Hello";
char[] arr = new char[str.length()];
for (int i = 0; i < str.length(); i++) {
	arr[i] = str.charAt(i);
}
System.out.println(Arrays.toString(arr));

// result : Hello

 

  • toCharArray(String str)
String str = "Hello";
char[] arr = str.toCharArray();
System.out.println(Arrays.toString(arr));

// result : Hello

 

오늘의 회고

문제  : [문자열을 정수로 바꾸기]

  • 어떤 문제가 있었고, 나는 어떤 시도를 했는지

문제명 그대로 문자열을 정수로 바꾸는 문제였다.

단, 잘못된 입력값이 들어오지 않으며, 1개의 부호가 맨앞에 올 수 있다.

그리고 문자열의 길이는 1이상 5이하이다.

 

처음 생각한 것은 파이썬 처럼 문자열을 배열이라 생각해서 -1 ~ -n 이런 식으로 뒷자리부터 자리수를 곱해서 넣을 생각이었다. 하지만, 애초에 문자열이기에 배열로 형변환이 필요했고, 파이썬과 같이 -1 이렇게 인덱스를 잡으면 에러가 나는 것을 확인했다. 

 

그렇게 생각하다가 ..

어짜피 문자열 기준 앞의 숫자에 10이 곱해지면 자리 수가 올라가기에 앞선 방식과 같이 뒷자리부터 넣으면서 자리 수를 계산해서 1, 10, 100 ... 이런 식으로 곱해 줄 필요가 없다는 생각을 하게 되었다.

부호 제외하고 첫 번째 문자를 넣고 두 번째 문자 * 10 + 세 번째 문자 이런 식으로 하면 앞서 했던 방식보다 복잡하지 않을 것이고 반복문도 1개만 사용하기에 효율적이라 생각해서 방법을 변경했다.

 

예시 : 123

0. 변수는 answer이라 가정

1. answer = 1

2. answer = answer(1) * 10 + 2 -> answer = 12

3. answer = answer(12) * 10 + 3 -> answer = 123

 

이렇게 동작하도록 코드의 흐름을 변경했다.

 

  • 어떻게 해결했는지
// 변수 : 부호, 문자열 크기, 인덱스 값
// 문자열 -> 배열로 변경 필요
// 문자열 맨앞 부호
    // 조건문 : "+"일 경우 -> 부호 저장 및 문자열 크기-1 인덱스+1
    // 조건문 : "-"일 경우 -> 음수 곱하기 및 부호 저장 및 문자열 크기-1 인덱스+1
// 문자열 -> 정수
    // 문자열의 크기 구하기(부호 제외된 상태)
    // answer = 첫 번째 숫자 
    // answer = 두 번째 숫자 * 10 + 세 번째 숫자 이런 식으로 반복문
// 음수 일 경우 -> answer * -1
        
// 잘못된 값 입력X
// s의 길이는 5이하(int의 범위 상관X)

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

 

  • 무엇을 새롭게 알았는지

오늘의 키워드에 작성된대로 charAt 함수와 형변환 관련 방법들에 대해 알게 되었다.

그리고 이제 자바로 변경해서 다른 언어들과 헷갈리거나 이상하게 개념을 잡고 있는 부분들이 꽤 된다는 걸 이번 문제를 통해 깨달았다. 앞으로도 더 많은 문제를 풀어나가겠지만, 그 과정에서 쉬운 부분부터 다시 차근차근 공부해야겠다.

마지막으로 오늘의 앞의 이틀과는 다르게 조금 더 다양한 방식으로 해결이 가능한 문제를 풀어서 그런지 생각하며 정리하는 과정이 난이도가 있다고 느꼈다

 

내일 학습할 것은 무엇인지

내일은 오늘 공부하지 못한 빅분기 자격증 공부를 할 것이며, 저녁엔 독서토론을 할 것이다.

또한, 오늘과 같이 클럽99에서 내어주는 비기너 문제와 기본기를 다지기 위해 백준 기본 문제를 조금 풀어보려고 한다.

중간중간엔 스파르타코딩클럽에서 진행 중인 내배캠에서 내어주는 과제 데일리미션 - 웹개발용어 정리 2를 작성해보며 용어 정리를 할 것이다.

 

 

728x90
반응형