<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 속도나 메모리 차이는 거의 없다)
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);
}
}
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);
}
}
toCharArray()
를 쓸 때는 char 배열의 초기화가 필요없다는 점이었다.어라… 왜 회색이 뜨지? (인텔리제이에서 회색이 뜨면 해당 코드가 안 쓰이고 있다는 뜻인데?)
toCharArray()를 주석처리를 해봤더니 다시 쓰인다는 뜻으로 색이 돌아온다.
그럼 toCharArray()를 쓸 때는 초기화할 필요가 없는 건가?
그렇다면 이렇게 한 줄로 코드를 줄일 수 있다. 훨씬 간결하다.
흠… 그렇군… 근데 왜?
구글링한 끝에 그 답을 찾을 수 있었다.
toCharArray()
String 문자열을 char형 배열로 바꿔서 반환해주는 메서드이다.
새로 할당된 문자배열의 길이는 이 문자열의 길이이고, 이 문자배열의 내용은 문자열에 포함하는 문자 내용을 순서대로 초기화한다.
⇒ 즉, 이 메소드를 쓰면 String으로 받은 문자열을 char 문자로 쪼갠 뒤, 알아서 문자열 길이를 주고, 알아서 초기화하며 char[]배열에 순서대로 값을 넣는다는 뜻이다.
[출처] https://ssdragon.tistory.com/31
[참고] Java에서 Char 배열 선언
→ toCharArray함수를 사용하거나, new 키워드를 사용하여 char배열 선언 및 초기화하는 법에 대해 나와있다.
번외로 찾아본 CharAt() 메소드
.charAt(index)
→ 괄호 안에 들어간 인덱스 값(String 중 한 글자)을 char 타입으로 바꿔준다.**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()
등등…
<참고>
컴퓨터는 문자를 문자로 기억하지 않는다. 그대신 순자로 기억하고 표현한다. 예를 들면 문자 '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개의 특수문자, 그리고 하나의 공백 문자로 이루어진다.
다양한 아스키 기반의 확장 인코딩들이 등장했으며, 이들을 묶어서 아스키라고 한다.