1. JLPT 단어 및 독해


공부 내용 및 문제 풀은것 등의 사진을 일단 내 컴퓨터에 파일형태로 킵;(저작권 문제)



2. 알고리즘 공부


백준 알고리즘 [1065번 한 수]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.io.*;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
 
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int cnt = 0;
        int x = Integer.parseInt(String.valueOf(br.readLine()));
 
        for(int i=1; i<x+1; i++){
            cnt += getHanNum(i);
        }
 
        bw.write(String.valueOf(cnt));
        bw.flush();
        bw.close();
    }
 
    private static int getHanNum(int num){
 
        int hanNum = num;
        int[] oneToEndArr = new int[String.valueOf(num).length()];      //index에 0부터 일의 자리의 숫자가 들어가는 배열
 
        if(oneToEndArr.length <= 2){        //어차피 0을 제외한 100 이하 자리는 전부 다 한수이기 때문에
            return 1;
        }else{
            int[] d = new int[oneToEndArr.length-1];        //100부터 1000까지는 여기에 들어와서 각 항의 차를 구한다.
            int j= 0, temp = 0;
 
            for(int i=0; i<oneToEndArr.length; i++){        //우선, 각 자릿수를 구해서 일의자리부터 끝자리까지에 해당하는 수를 oneToEndArr 배열에 넣어준다
                oneToEndArr[i] = hanNum%10;
                hanNum /= 10;
            }
 
            for(int i=oneToEndArr.length-1; i>0; i--){      //일의 자리와 십의 자리, 십의 자리와 백의 자리에 해당하는 차를 d 배열에 넣는다
                d[j] = oneToEndArr[i] - oneToEndArr[i-1];
                j++;
            }
            if(d[0== d[1]){                               //각 항의 차가 등차가 되는지 비교
                return 1;
            }else{
                return 0;
            }
        }
    }
}
cs

아쉬웠던 점: 입력이 1000이하의 숫자가 들어간다는게 조건이지만 1000이상의 자릿수가 입력이 됐을때에도 작동하게 만들고 싶어서 욕심을 내다보니 시간을 많이 잡아먹었다.

카테고리의 목적: 



   무엇을 할 것인가? 본 포스팅 카테고리에서는 JLPT와 알고리즘 공부한 내용을 포스팅 할 것인데, 사실 공부를 너무 게으르게 해서 목표치를 가지고 공부해서 JLPT N2 취득 및 알고리즘 공부 이 두 마리 토끼를 다 잡아볼 예정이다.


   어떻게 할 것인가? JLPT 시험에서 컷트라인을 넘겨도 N2 독해에서 과락이 나와서 취득이 어려우니 'JLPT 콕콕 찍어주마 N2 독해', '딱 한 권 JLPT N2단어장'으로 각각 20p, 1Day씩 공부하고, 알고리즘은 BOJ 단계별 풀어보기 부분에서 한 문제 이상씩 풀어서 공부한 내용을 간단히 사진첨부와 함께 시험 전 날인 12월 2일 전까지(일주일간) 포스팅할 것이다.


   왜 JLPT를 공부하나? 사실 공대생에게 어학능력이란 C, Java, React.js등 대중적인 컴퓨터언어능력을 높이는게 도움이 되지 어학능력은 크게 도움이 되질않는다. 하지만 나는 글로벌하게 인간관계를 구축하고 싶은 욕심이 있기도 하고, 나아가 이 능력을 증명해 추후 다른 분야에서도 활용하고 싶기떄문에 이 자격증을 따려고 한다. 굳이 JLPT만 준비하는 것도 아닐뿐더러, 해외 어학원 경험을 통해 외국인과도 편하게 말을 주고받을 수 있는 상태이다. 외국인 친구도 다수 사귀었고, 이 능력을 십분 활용해 OPIc시험에서도 공대생치고는 높은 점수를 받았다.(OPIc 시험을 준비할 떄엔 블로그를 쓸 생각을 하지않았으니 OPIc 포스팅은 패스)


   최종적으로? 일본어로 된 IT관련 기술블로그 포스팅 된 것을 번역해서 올려보자.



상세한 내용은 거두절미하고 오늘부터 스타트!


D-6



1. 일본어 단어 암기 및 문제 푼거


사진을 올리려했으나 저작권의 문제가 있으니 일단 올리고 비공개로 대체.... 하려했으나 최대 업로드 가능 용량이 10메가인 관계로 일단 킵;


2. 백준 알고리즘 [4673번 셀프넘버]


풀이 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.io.*;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
 
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        boolean[] isNotSelfNum = new boolean[10000];            //셀프넘버가 아닌건지를 물어보는 것이기 때문에 
                                                                // false -> 셀프넘버 , true -> 생성자가 있는 넘버
 
        for(int i=0; i<isNotSelfNum.length; i++){
            if(getDn(i)<10000){
                isNotSelfNum[getDn(i)] = true;
            }
        }
 
 
        for(int i=0; i<10000; i++){
            if(!isNotSelfNum[i]){
                bw.write(String.valueOf(i));
                bw.newLine();
                bw.flush();
            }
        }
        bw.close();
 
    }
 
    private static int getDn(int i){                //selfNumber가 아닌 수들을 반환
 
        int dn, thousand, hundred, ten, one;
 
        thousand = i/1000;
        hundred = i/100%10;
        ten = i/10%100%10;
        one = i%10;
 
        dn = i + thousand + hundred + ten + one;
 
        return dn;
    }
}
cs


헤맨 부분: 처음에는 12번째 for문의 진행이 아닌 while(true)문으로해서 getDn메소드로 반환받는 숫자가 10000보다 커지면 break문으로 탈출해서 더 이상 getDn의 매개변수로 숫자가 들어갈 일이 없게 즉, dn의 크기가 10000만 넘기만 한다면 다음 숫자를 적용시키지 않았다. 실제로 값을 넣어서 구해보면 d(9968) = 10000인데, d(9973) = 9999이다. 따라서 생성자가 있는데도 불구하고 셀프넘버로 들어가버린 숫자가 존재했고 그대로 출력해서 문제를 틀렸었던것.

시작하며


 알고리즘 공부를 하다보면 여러 숫자들을 비교해야하는 경우가 다분히 생기는데, 그 때마다 형변환을 해준다던지 Integer.valueOf나 Integer.parseInt를 사용해서 숫자를 비교하며 조건문을 넣어주는 경우가 많이 생긴다. 알고리즘을 공부하면서 그 둘의 차이점이 무엇인지 문득 궁금해졌는데 그 차이에 대해 알아보도록 하자.



들어가며

우선 parseInt와 valueOf의 주된 차이점에 대해 알아보자.


  • Integer.parseInt : Primitive type인 int형을 반환


1
2
3
public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
}

cs



  • Integer.valueOf : Wrapper Object인 Integer를 반환

1
2
3
public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
}

cs




  위의 두 가지 코드의 차이에 대해서 알아보자.

 


우선, 코드상에서 보이는 가장 큰 차이는 

  • 반환 타입이 int와 Integer Obejct로 다르다는 것이다.



♤그렇다면 여기서 int와 Integer는 어떻게 다른가?


간단하게 말하자면 int는 기본자료형(unboxed primitive type)

Integer는 참조자료형 또는 기본자료형들에 대응되는 객체화된 자료형(boxed primitive type) 이라고 할 수가 있겠다.

아니, 그동안 int형만 자주 쓰느라 참조자료형이랑 말은 생소한데 이건 또 뭐지.... 하는 의문이 생겼고


또, 그렇다면 기본 자료형과 객체화 된 자료형은 어떻게 다른가?로 귀결될 수 있는데!

보통 흔히 쓰는 int, long, boolean등의 자료형들을 기본 자료형이라 하고 Integer, Long, Boolean 등을 객체화 된 자료형이라고 한다.


이렇게만 설명을 들으면 이해하기가 힘들기 때문에 몇 가지 예시를 통해서 기본 자료형과 객체화 된 자료형의 차이를 보도록 하자.


1. 기본자료형은 값만 가지지만 객체환 된 자료형은 각각의 신원(identity)을 가진다.

 -> 즉, int a = 42, b = 42; 일때 a==b는 같지만 c==d는 다를 수 있다는것


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int a = 42;
int b = 42;
 
Integer c = new Integer(42);
Integer d = new Integer(42);
 
if(a==b){
    System.out.println("Success");
}
 
if(c==d){
    System.out.println("Success too");
}else{
    System.out.println("They have different identity");
}

cs




2. 기본 자료형은 int형 값을 가지기 때문에 산술연산을 할 수 있지만 객체화 된 자료형은 Integer클래스을 받기 때문에 

    unboxing(wrapper 클래스 -> primitive 자료형)을 해주지 않으면 산술연산을 할 수 없다. 하지만, 기본자료형과 달리 null값으로 처리할 수 있기

    때문에 SQL과 연동할 경우 처리가 용이하다.


1
2
int a = null;           // null값으로 초기화 할 수 없음
Integer b = null;       // null값으로 초기화 할 수 있음
cs



3. 굳이 객체화된 자료형을 사용할 이유가 없다면 primitive 타입을 쓰는 것이 공간효율적인 측면에서 좋다.


Integer의 사이즈 : 20byte

int의 사이즈 : 4byte



그렇다면 Integer(객체화 된 자료형)는 언제 쓰는가?

 

 Integer와 같은 객체화 된 자료형들은 아까 위에서 보았듯이,


첫째, null값으로의 처리가 유용하기 때문에 SQL과 연동할 경우 즉, DB를 사용해서 쿼리문을 짜줘야하는 경우에 유용하다.

둘째, ArrayList나 List등의 요소, 키, 값으로 사용할 때 이다. 다시 말해서 ArrayList<int>는 안되지만 ArrayList<Integer>로 사용할 수 있다는 말이다.


끝마치며

 처음에는 단순히 valueOf와 parseInt의 차이점에 대해서만 간단히 쓰고 넘어가고자 했는데 공부하면서 Integer(Wrapper Class)와 int(Primitive type)의 차이에 대해서 알아야된다는 것을 알게 되었고, 기본 자료형과 참조 자료형의 차이에 대해 비교를 하게 되었다. 그리고 결국엔 돌고돌아 parseInt와 valueOf의 정확한 return 타입과 그 쓰임새에 대해 이해할 수 있게 되었다.


 처음에는 단순히 이렇게 마냥 쓰는거구나 하면서 아무생각 없이 선언했었지만 이렇게 점점 깊게 파보게 되니 Auto-boxing, Auto-unboxing의 개념에 대해서도 알게 되었고 쓸데없이 객체를 만들거나 자바에서 객체화 비객체화가 일어나며 리소스를 낭비될 수 있다는 것도 이해하게 되어 시간은 오래걸렸지만 좀 더 기본기에 대한 이해도가 높아진 것에 대해 만족한다.

'알고리즘 공부 > 알고리즘 지식' 카테고리의 다른 글

Scanner와 BufferReader의 차이  (0) 2018.10.09

+ Recent posts