본문 바로가기
알고리즘

[알고리즘] 코드업 : 알고리즘을 풀어보자 - Java /기초100제 1019번, 1020번/int와 integer 차이/split 그리고 substring으로 문자열 자르기

by JM0121 2021. 1. 31.

 

자바를 공부한지 한달정도 되었는데 백준으로 알고리즘을 풀다가 어느장도 자바에 익숙해지고 풀 수 있는 문제들은 어

 

느정도 풀고 난 뒤 슬슬 어려운 문제들이 남아서 코드업 기초 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()은 결과 값이 달라질 수 있으므로 다른 방법을 찾아야 한다.