문제:
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int sum = 0;
int n = Integer.parseInt(br.readLine());
String num = br.readLine();
char[] cNum = num.toCharArray();
for (int i = 0; i< n; i++) {
sum += cNum[i] - '0';
}
System.out.println(sum);
}
}
먼저 문자열로 두번째 줄 값을 입력 받은 후 toCharArray()를 이용해 문자형으로 변경시켜주었다.
🤔 toCharArray()는 무엇?
String 문자열을 char형 배열로 바꿔서 반환해주는 메서드이다.
즉 "ABCD"가 존재한다면,
arr[0] = 'A' ....
arr[3] = 'D' 처럼 변경해주는 것
좀 더 부연설명을 하기 위해 열심히 남의 블로그 탐방을 한 바,
위의 코드를 좀 더 찾아볼 수 있었다.
먼저 new char[value.length]를 통해 값의 길이만큼 배열을 생성함을 알 수 있으며,
System.arraycopy를 사용해, 배열을 복사하는 것을 볼 수 있다.
System.arraycopy란
이름 그대로 배열을 복사하는 것으로, System class의 메서드이다
해당 메서드는 return이 없는 void메서드로
void arraycopy(Object src, int srcPos, Object dst, int dstPos, int length)
* src : 원본 배열
* srcPos : 원본 배열에서 복사할 항목의 시작 인덱스
* dest : 새 배열
* destPos : 새 배열에서 붙여 넣을 시작 인덱스
* length : 복사할 개수
이렇게 사용할 수 있다. 즉 위의 코드는
value(원본 배열), 0(시작 인덱스), result(새 배열), 0(시작 인덱스), 원본 배열 길이로
배열을 복사한 것을 볼 수 있다.
※ arraycopy는 얕은 복사로, 실제 값을 새로운 메모리 공간에 복사하는 (깊은 복사)와 달리
주소값을 복사하는 (얕은 복사)이다.
그 후 for문을 이용해 배열안에 존재하는 값을 정수형으로 변경해 sum 변수에 합을 더한다.
for (int i = 0; i< n; i++) {
sum += cNum[i] - '0';
}
여기서 잠깐~.. cNum[i]에 왜 문자형 '0'을 빼주는 것인가? 하면은
문자열을 숫자형으로 변경할 때는 아스키 코드를 사용해야 하는데, 이때 아스키 코드에서 같은 의미의 문자와 숫자의 코드 값 차이는 48이다. 따라서 48을 빼주거나
'0'(<- 이친구가 48의 값을 가진다)을 빼주어 숫자형으로 나타낼 수 있는 것.
처음에는 굉장히 쉬운 문제라고 생각했는데, 머리가 굉장히 나쁜지.. 좀 오래 고민했다
고민한 흔적에 대해서 회고하면..
1. 두번째 줄 입력 ex)54321 이것을 한줄로 받을 수 있는 방법이 무엇이 있을까를 고민했다.
바보였다.. 그냥 문자열로 받으면 되는 것을 StringTokenizer로 어떻게 분해시킬 수 있을까?
고민하였지만 결국 답지를 보고 나서 간단하게 생각할 수 있다는걸 깨달았다.
출처:
https://kang-james.tistory.com/entry/자바-파헤치기-Arrays-Systemarraycopy-를-활용하여-배열-다루기 [내 꿈을 JAVA:티스토리]