자바를 공부한지 한달정도 되었는데 백준으로 알고리즘을 풀다가 어느장도 자바에 익숙해지고 풀 수 있는 문제들은 어
느정도 풀고 난 뒤 슬슬 어려운 문제들이 남아서 코드업 기초 100제 문제로 다시 자바를 다져보려고 한다.
일단 첫 날은 1001번부터 1030번까지 풀어봤다. 기초 문제들이라 그런지 아니면 백준을 미리 풀어봐서 인지 상당히 쉽
게 문제 없이 풀 수 있었다.
하지만 문제들을 풀다가 미흡한 부분들을 찾을 수 있었다. 그래서 블로그에 정리해두고 복습할 생각이다.
#1019 : [기초-입출력] 연월일 입력받아 그대로 출력하기
[문제]
년, 월, 일을 입력받아 지정된 형식으로 출력하는 연습을 해보자.
[입력]
연, 월, 일이 ".(닷)"으로 구분되어 입력된다.
[출력]
입력받은 연, 월, 일을 yyyy.mm.dd 형식으로 출력한다.
(%02d를 사용하면 2칸을 사용해 출력하는데, 한 자리 수인 경우 앞에 0을 붙여 출력한다.)
• 풀이
자바는 문자열을 받는 방법이 여러 개 있지만 Scanner를 사용할 것이다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
String[] arr = a.split("[.]"); // "." 로 구분
Scanner를 통해 문자열을 입력 받고 arr배열을 만들어 "." 을 기준으로 문자열을 자를 수 있다.
원래 split()은 split("-") 이런 식으로 특정 문자를 지정하여 자를 수 있는데, "." 같은 경우는 "[.]" 혹은 "//." 으로 사용해야 한다.
int y = Integer.valueOf(arr[0]); //Integer.parseInt(arr[0]);
int m = Integer.valueOf(arr[1]); //
int d = Integer.valueOf(arr[2]); //
System.out.println(String.format("%04d.%02d.%02d", y, m, d));
※여기서 중요한 부분이 나온다. int와 integer의 차이
int는 long, double 과 같이 Primitive 자로형, 원시형 변수이지만 integer는 Wrapper 클래스 타입이다.
int
-산술 연산 가능
-null을 초기값으로 가질 수 없음 (0)
integer
-Unboxing(Wrapper > Primitive 자료형)을 하지 않으면 산술 불가능
-null 값 가질 수 있음
또한 ValueOf 와 ParseInt를 둘 다 사용할 수 있는데 ValueOf와 ParseInt의 차이점을 알아보자면,
valueOf : integer형을 리턴 받아 산술 연산 불가능
parseInt : int형을 리턴 받아 산술 연산 가능
위 문제에서는 따로 연산이 필요 없기에 둘 중에 아무거나 사용을 해도 값은 똑같이 나온다.
마지막으로 String.format("%04d.%02d.%02d", y, m, d)를 사용해 문자열 의 포멧을 지정하여 출력한다.
% 시작이고 두 번째 '0' 은 채워질 문자 세 번째 '2,4'는 총 자리 수 'd'는 십진정수를 의미한다. 'd' 외에도
%f 부동 소수점, %x 16진수, %c 문자 를 사용할 수도 있다.
전체 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
String[] arr = a.split("[.]");
int y = Integer.valueOf(arr[0]);
int m = Integer.valueOf(arr[1]);
int d = Integer.valueOf(arr[2]);
System.out.println(String.format("%04d.%02d.%02d", y, m, d));
}
}
정상적으로 잘 동작한다.
#1020 : [기초-입출력] 주민번호 입력받아 형태 바꿔 출력하기
[문제]
주민번호는 다음과 같이 구성된다.
XXXXXX-XXXXXXX
앞의 6자리는 생년월일(yymmdd)이고 뒤 7자리는 성별, 지역, 오류검출코드이다.
주민번호를 입력받아 형태를 바꿔 출력해보자.
[입력]
주민번호 앞 6자리와 뒷 7자리가 '-'로 구분되어 입력된다.
(입력값은 가상의 주민번호이다.)
ex)110011-0000000
[출력]
'-'를 제외한 주민번호 13자리를 모두 붙여 출력한다.
• 풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
System.out.println(a.substring(0,6) + a.substring(7,14));
}
}
앞 문제와 달리 이번엔 split 대신 String.substring(start, end) 를 통해 시작 지점과 끝 지점을 정해 문자열을 자를 수 있
다. 주민번호는 앞자리 수와 뒷자리 수는 고정되어 있어 시작 지점과 끝 지점을 정하면 정상적으로 출력을 할 수 있다.
하지만 입력 받는 자리 수가 가변적일 경우 String.substring()은 결과 값이 달라질 수 있으므로 다른 방법을 찾아야 한다.