[TIL_Algorithm] toCharArray, 문자열을 숫자형으로 변환

effiRin·2022년 7월 14일
0

Algorithm

목록 보기
2/4
post-thumbnail

<Do it! 알고리즘 코딩테스트 - 자바 편>
문제 1 - 백준 11720번 (https://www.acmicpc.net/problem/11720)



문제풀기

베스트 답

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SumOfTwoNums {

    // 문제 1번 - https://www.acmicpc.net/problem/11720

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int countOfNum = Integer.parseInt(br.readLine());
        String sNum = br.readLine();

        // char 배열로 바꾸기
        char[] cNum = sNum.toCharArray();

        int sum = 0;

        for (int i = 0; i < cNum.length; i++) {
            sum += cNum[i] - '0';
        }

        System.out.println(sum);
    }
}

  • Scanner 대신에 BufferedReader를 이용했다. (Scanner보다 훨씬 빠르고 메모리도 적게 든다)

  • char 문자를 아스키코드에 따라 -’0’ 을 주는 식으로 풀었다.
    → Integer.parseInt(String.valueOf( )) 를 이용하는 것보다 빠르다.

  • char 배열 new 초기화 생략 (but 속도나 메모리 차이는 거의 없다)



다른 답 1

  • Scanner 이용 + Integer.parseInt(String.valueOf( )) 를 이용 → 제일 느림
import java.util.Scanner;

public class SumOfTwoNums {

    // 문제 1번 - https://www.acmicpc.net/problem/11720

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);

        // 입력
        int countOfNum = Integer.parseInt(s.nextLine());
        String sNum = s.nextLine();

        // char 배열 숫자로 바꿔서 더해주기
        char[] cNum = new char[countOfNum];
        cNum = sNum.toCharArray();
        
        int sum = 0;
        
        for (int i = 0; i < cNum.length; i++) {
            sum += Integer.parseInt(String.valueOf(cNum[i]));
        }
        System.out.println(sum);
    }

}



다른 답 2

  • Scanner 이용 + char 문자를 아스키코드에 따라 -’0’ 을 주는 식
import java.util.Scanner;

public class SumOfTwoNums {

    // 문제 1번 - https://www.acmicpc.net/problem/11720

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);

        // 입력
        int countOfNum = Integer.parseInt(s.nextLine());
        String sNum = s.nextLine();

        // char 배열 숫자 배열로 바꾸기
        char[] cNum = new char[countOfNum];
        cNum = sNum.toCharArray();

        int sum = 0;

        for (int i = 0; i < cNum.length; i++) {
            sum += cNum[i]-'0';
        }

        System.out.println(sum);
    }
}



공부하기

1. toCharArray() 그리고 초기화

  • 문제를 풀 때 가장 의아했던 점은…
    toCharArray()를 쓸 때는 char 배열의 초기화가 필요없다는 점이었다.

어라… 왜 회색이 뜨지? (인텔리제이에서 회색이 뜨면 해당 코드가 안 쓰이고 있다는 뜻인데?)

toCharArray()를 주석처리를 해봤더니 다시 쓰인다는 뜻으로 색이 돌아온다.
그럼 toCharArray()를 쓸 때는 초기화할 필요가 없는 건가?

그렇다면 이렇게 한 줄로 코드를 줄일 수 있다. 훨씬 간결하다.
흠… 그렇군… 근데 왜?
구글링한 끝에 그 답을 찾을 수 있었다.

  • toCharArray()
    • String 문자열을 char형 배열로 바꿔서 반환해주는 메서드이다.

    • 새로 할당된 문자배열의 길이는 이 문자열의 길이이고, 이 문자배열의 내용은 문자열에 포함하는 문자 내용을 순서대로 초기화한다.

      ⇒ 즉, 이 메소드를 쓰면 String으로 받은 문자열을 char 문자로 쪼갠 뒤, 알아서 문자열 길이를 주고, 알아서 초기화하며 char[]배열에 순서대로 값을 넣는다는 뜻이다.

[출처] https://ssdragon.tistory.com/31


  • Char 배열 선언과 초기화에 대한 자세한 설명은 아래 글 참고

[참고] Java에서 Char 배열 선언
toCharArray함수를 사용하거나, new 키워드를 사용하여 char배열 선언 및 초기화하는 법에 대해 나와있다.



2. CharAt()

번외로 찾아본 CharAt() 메소드

  • String으로 저장된 문자열 중에서 한 글자만 선택해서 char 타입으로 변환해준다.
  • .charAt(index) → 괄호 안에 들어간 인덱스 값(String 중 한 글자)을 char 타입으로 바꿔준다.
  • 한 글자만 가져와도 되는 경우엔 이 메소드가 훨씬 효율적일 것 같다.



3. Java의 형 변환 메소드

  • **Integer.parseInt()Integer.valueOf() 의 차이는?**
    • **Integer.parseInt() 는 primitive(기본형, 원시) 타입의 int를 반환한다. **
      public static int parseInt(String s) throws NumberFormatException {
          **return parseInt(s,10);**
      }
    • **Integer.valueOf()Integer 객체**를 반환한다.
      @HotSpotIntrinsicCandidate
          public static Integer valueOf(int i) {
              if (i >= IntegerCache.low && i <= IntegerCache.high)
                  return IntegerCache.cache[i + (-IntegerCache.low)];
              **return new Integer(i);**
          }

[참고] Integer.parseInt() vs Integer.valueOf() 차이

  • 그 외

Double.valueOf()
Float.valueOf()
Long.parseLong()
Short.parseShort()

등등…



4. 문자열을 숫자형으로 변경할 때 (Feat. 아스키 코드)

  • 문자열을 숫자형으로 변경하려면 아스키코드를 이해하고 있어야 한다.
    • 아스키코드에서 같은 의미의 문자와 숫자의 코드 값 차이는 48이다.
    • 예를 들어, 문자 ‘1’을 숫자 1로 변환하려면 ‘1’-48 또는 ‘1’-’0’과 같이 연산하면 된다. (문자 ‘1’은 아스키코드 값이 49 / 문자 ’0’은 아스키코드 값 48)
    • (참고로 당연한 이야기지만… 아스키코드는 ‘문자 인코딩’이기 때문에 숫자 0은 해당 X

<참고>

  • 아스키코드 - ASCII

    컴퓨터는 문자를 문자로 기억하지 않는다. 그대신 순자로 기억하고 표현한다. 예를 들면 문자 'A'는 65로, 'B'는 66으로 표현한다. 그런데 사람마다 규칙을 개인대로 정하면 자칫 소통하는데 오류가 생길 것이다.

    예를 들어 어떤 사람은 'A'는 1로, 'B'는 2로 표현 할 수 도 있을 것이다. 그래서 모든 사람이 공통적으로 쓸 수 있는 표준 규격이 필요한데, 이것이 바로 아스키(ASCII : American Standard Code for Information Interchange - 미국 정보 교환 표준 부호)다.

    (출처 : https://stepbystep1.tistory.com/10 )

    • 영문 알파벳에 기초를 둔 대표적인 문자 인코딩으로, 대부분의 문자 인코딩이 아스키를 기반으로 한다.

    • 아스키는 7비트 인코딩으로, 33개의 출력 불가능한 제어 문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 이루어진다. (제어 문자들은 역사적 이유로 남아 있으며, 대부분은 더 이상 사용되지 않는다)

    • 출력 가능한 문자들은 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수문자, 그리고 하나의 공백 문자로 이루어진다.

    • 다양한 아스키 기반의 확장 인코딩들이 등장했으며, 이들을 묶어서 아스키라고 한다.



profile
모종삽에서 포크레인까지

0개의 댓글