반응형

정말 단순하면서 어려웠던 문제..


입력의 값이 크지 않기 때문에 반복문을 돌려도 된다.


1. 5로 나눠질때까지 계속 해서 3을 빼주면 된다. 또는 3으로 빼가면서 크기가 0보다 같거나 작아지면 종료한다.

2. 만약 처음값이 0보다 작은 값이면, 5던지 3이던지 나눠질 수 없는 값이다. 그런경우 -1을 출력한다.



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
import java.io.FileInputStream;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(new FileInputStream("input.txt"));
        // Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int five = 0;
        int three = 0;
        
        
        while(N%5!=0&&N>=0){
            N-=3;
            three++;
        }
        if(N<0){
            System.out.println(-1);
        }
        else{
            five = N/5;
            System.out.println(five+three);        
        }
    
    }
 
}
 
cs


반응형
반응형

전체 탐색으로 하면 시간 초과가 날 것 같아서 HashSet를 사용했다.

또한, 중복된 수가 없었기 때문에 HashSet 사용이 가능했다.


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
import java.io.FileInputStream;
import java.util.HashSet;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(new FileInputStream("input.txt"));
        // Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        HashSet<Integer> set = new HashSet<Integer>();
        for (int i = 0; i < N; i++) {
            set.add(sc.nextInt());
        }
 
        int M = sc.nextInt();
        for (int i = 0; i < M; i++) {
            if (set.contains(sc.nextInt())) {
                System.out.print(1);
            } else {
                System.out.print(0);
            }
            System.out.print(" ");
        }
    }
 
}
 
cs


반응형
반응형

강남역 근처에 있는 비트빌에서 다우기술 기술역량평가 시험을 보러 갔다 왔다.

문제는 TOPCIT 이랑 똑같았다. 진짜 그냥 TOPCIT 문제..

시간자체가 부족하지 않을 줄 알았는데 시간자체도 남지는 않더라.

한 2시간 반동안 시험 쳤고 중간에 화장실은 갔다올 수 있다.

2시간 반 동안 시험치고 30분정도 쉬더라? 근데 다우기술 평가하는 사람 말고 다른 사람은 TOPCIT 시험검사만 하고 집에 가더라...

30분 쉬고 나서 인적성 시험을 100분정도 봤는데 인성 끝나고 기다렸다가 다같이 적성을 푸는게 아니라 인성 끝나는 사람 먼저 적성을 치더라

컴퓨터로 인적성을 치다보니 조금 이상하기도 했지만 그리 어려운 문제가 나온것 같지는 않았다. 60분에 70문항인가? 나는 몇개 안풀고 찍고 냈는데 시간이 오히려 남았다.

그냥 시간은 남으니까 처음부터 차근히 풀걸 그랬음.. 

사람은 30명씩 4반에서 봤다니깐 120명 정도 본것 같고 인턴전환률은 그리 나쁘지 않다고 하더라. 감독관이

그리고 뭐 딱히 생각나는 점은 없었더... 그리고 서류는 다 붙혀준거 아니라고 했고.....

반응형
반응형

음수가 있는지 모르고 엄청 헤맨 문제;;


첫째 줄에 수의 개수 N(1<=N<=1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절대값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. 라는 문구를 제대로 이해하지 못했다.

즉, 음수도 가능하다는 얘기


그렇다면 음수와 양수를 어떻게 나눌 것인가에 대한 문제가 생긴다. 

배열 위치는 항상 양수만 가능하기 때문에 (arr[-900]같은 음수들은 존재 불가)

나는 0~1000000까지는 음수를 저장하는 변수로 1000001~2000000 은 양수를 저장하는 변수로 만들었다.

처음에 1000000을 더해주고 결과를 낼때는 1000000을 빼주면 된다.

예를들어) -1000000은 Arr[0]에 저장되고, 나올때 -1000000의 값을 빼기때문에 결과는 큰 상관이 없다.


그리고 Count Sorting을 이용하여 문제를 풀었다.



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
import java.io.FileInputStream;
import java.util.Scanner;
 
public class Main {
    public static void main(String args[]) throws Exception {
        // Scanner sc = new Scanner(System.in);
        Scanner sc = new Scanner(new FileInputStream("input.txt"));
 
        Integer a=  null;
        int N = sc.nextInt();
        int size = 2000000;
        int[] arr = new int[size + 5];
        for (int i = 1; i <= N; i++) {
            //Count Sorting... 해당 값의 위치를 1로 바꿔준다.
            //음수가 있기 때문에 1000000을 더해준다.
            arr[sc.nextInt() + 1000000= 1;
        }
        for (int i = 0; i <= size; i++) {
            //모두 출력했는데 계속해서 반복문을 돌 수 있으니깐 N==0일때 종료되게 해준다.
            if(N==0break;
            //Count Sorting이기 때문에 배열이 0이면 넘어간다. 
            if (arr[i] != 0) {
                System.out.println(i-1000000);
                N--;
            }
        }
    }
}
cs


반응형
반응형

문제에 나와있는대로 

1. 첫 번째 조각의 수가 두 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.

2. 두 번째 조각의 수가 세 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.

3. 세 번째 조각의 수가 네 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.

4. 네 번째 조각의 수가 다섯 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.

5. 만약 순서가 1, 2, 3, 4, 5 순서가 아니라면 1 단계로 다시 간다.

의 규칙대로 진행해주면 된다.

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import java.io.FileInputStream;
import java.util.*;
 
public class Main {
    public static void main(String args[]) throws Exception {
        // Scanner sc = new Scanner(System.in);
        Scanner sc = new Scanner(new FileInputStream("input.txt"));
 
        int[] arr = new int[5];
        int[] answer = new int[5];
 
        for (int i = 0; i < 5; i++) {
            arr[i] = sc.nextInt();
        }
 
        while (check(arr)) {
            // 1vs2, 2vs3, 3vs4, 4vs5 비교
            for (int x = 0; x <= 3; x++) {
                // 앞의 숫자가 크고 정렬되지 않았다면 swap한다.
                if (compare(arr, x, x + 1&& check(arr)) {
                    swap(arr, x, x + 1);
                    print(arr);
                }
            }
        }
 
    }
 
    // x번째와 y번째 값 바꾸기
    public static void swap(int[] arr, int x, int y) {
        int swap;
        swap = arr[x];
        arr[x] = arr[y];
        arr[y] = swap;
    }
 
    // x번째와 y번째 값 비교하기
    public static boolean compare(int[] arr, int x, int y) {
        if (arr[x] > arr[y]) {
            return true;
        }
        return false;
    }
 
    // 나무조각 5개이기 때문에 1,2,3,4,5 로 정렬됐는지 체크
    public static boolean check(int[] arr) {
        boolean flags = false;
        for (int i = 0; i < 5; i++) {
            if (arr[i] != (i + 1)) {
                flags = true;
                break;
            }
        }
        return flags;
    }
    //출력문
    public static void print(int[] arr) {
        for (int i = 0; i < 5; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
 
    }
}
 
cs


반응형
반응형

1자리 수 일때는 1 만 올 수 있다. (1개)

2자리 수 일때는 10 만 올 수 있다. (1개)

3자리 수 일때는 101, 100 이 올 수 있다. (2개)

4자리 수 일때는 1010, 1000, 1001 이 올 수 있다. (3개)

5자리 수 일때는 10100, 10101, 10000, 10001, 10010 이 올 수 있다. (5개)

6자리 수 일때는 101000, 101001, 101010, 100000, 100001, 100010, 100100, 100101 이 올 수 있다. (8개)


어느 정도 규칙이 보이지 않는가? 1 - 1 - 2- 3- 5- 8 - ???

안 보인다면 7자리 수일떄도 해보겠다.


1010000, 1010001, 1010010, 1010100, 1010101, 1000000, 1000001, 1000010, 1000100, 1000101, 1001000, 1001001, 1001010 (13개)


이정도면 보였으리라 생각한다. 피보나치의 규칙을 갖고 있다.

피보나치의 규칙을 이용해서 문제를 풀면 끝!


사실 이문제는 끝자리가 0으로 끝나는 dp[N][0], 1로 끝나는 dp[N][1] 로 푸는게 맞다.

앞의 수가 0일때는 0,1이 둘다 올수 있고 앞의수가 1일때는 0밖에 못오니깐..

아무튼 쉬운 경로로 풀면 되긴 하지만, 좀 더 직관적으로 보이는 뒤의 방법을 이용하는 것이 좋아보인다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.FileInputStream;
import java.util.*;
public class Main {
    public static void main(String args[]) throws Exception {
        // Scanner sc = new Scanner(System.in);
        Scanner sc = new Scanner(new FileInputStream("input.txt"));
        int N = sc.nextInt();
        int[] arr = new int[N];
        if (N == 1) {
            arr[0= 1;
        } else if (N == 2) {
            arr[1= 1;
        } else {
            arr[0= 1;
            arr[1= 1;
            for (int i = 2; i < N; i++) {
                arr[i] = arr[i - 1+ arr[i - 2];
            }
        }
        System.out.println(arr[N-1]);
    }
}
 
cs


반응형
반응형

int vs Integer


가장 큰 차이점은 원시 자료형과 Wrapper 클래스의 차이이다.


int

- 원시 자료형을 사용 (ex. int, float, double, char 등등)

- NULL 값으로 초기화 불가능


Interger

- Wrapper 클래스를 사용

- 클래스 이기 때문에 NULL 값으로 초기화 가능하다.



Boxing

Boxing 은 박스로 감싸다라는 뜻이 있다. 즉 원시 자료형을 클래스로 감싼다는 뜻이다.

원시 자료형을 Wrapper 클래스로 바꾸는 것을 Boxing 이라 하며

Wrapper 클래스를 원시 자료형으로 바꾸는 것을 UnBoxing 이라 한다.

* JDK 1.5 이후 자동으로 Boxing, UnBoxing 해주는 AutoBoxing, AutoUnBoxing 기능을 제공한다. 



Wrapper 클래스를 사용하는 이유?

1. 객체 또는 클래스가 제공하는 메소드를 사용 할때

2. 클래스가 제공하는 상수를 사용할 때 (MIN_VALUE and MAX_VALUE)

3. 숫자, 문자로의 형변환 또는 진법 변환할때

즉, 기본 자료형(primitive data types)에 대한 클래스 표현을 래퍼 클래스(wrapper classes)라 부른다.


Wrapper 클래스의 종류




반응형
반응형

인터프리터 vs 컴파일러


일반적으로 인간이 이해하기 쉽게 만들어진 high-level 언어를 사용하여 컴퓨터 프로그래밍을 한다.

주로 영어로 되어있는 문장이나 단어들을 포함한 것을 말하며 Source Code라 불린다. 하지만 컴퓨터는 high-level 언어를 이해하지 못한다.

컴퓨터는 이진수인 0's 과 1's로 구성된 언어, 즉 machine Code 만 인식할 수 있다.

우리는 Source Code를 machine code로 변역해야 하는데 이 과정을 Compiler 와 Interpreter 가 해준다.

즉, 컴파일러와 인터프리터는 high-level 언어를 Machine Code로 변환해주는 소프트웨어 이다. 


인터프리터(Interpreter)

정의) 프로그램을 해석하는 방법 중 하나로, 사람이 이해할 수 있는 고급언어로 작성된 코드를 한 단계씩 해석하여 실행시키는 방법을 말한다.

인터프리터는 Object Code 나 Machine Code로 변환하지 않은 채 즉시 Source Code 안 instructions 을 실행 시킨다.

즉, 인터프리터 언어로 작성된 소프트웨어는 결과물이 없기 때문에 실행할 때마다 번역작업이 필요하다.

인터프리터를 사용하면 원시 프로그램을 명령어 단위로 변환하고 프로그램 전체에 대해 분석하지 않으므로 변환 시간이 짧다.

그러나 프로그램을 실행할 때마다 변환 과정이 필요하고 프로그램을 최적화할 수 없기 때문에 프로그램의 실행속도가 느리다.


컴파일러(Compiler)

정의) 고급언어로 쓰인 프로그램을 그와 의미적으로 동등하며 컴퓨터에서 즉시 실행될 수 있는 형태의 목적 프로그램으로 바꾸어 주는 번역 프로그램.

컴파일러는 전체 프로그램을 가지고 Object Code로 변환한다. Object Code는 Binary Code로 불리우며 linking 후에 Machine에 의해 즉시 실행된다.

컴파일러의 변환은 한 번만 수행되면 Object Code가 만들어 지고, 이 프로그램을 계속 사용할 수 있다. 하지만 변환에 시간이 많이 걸린다는 단점이 있다.

즉, 컴파일러를 사용하면 원시 프로그램을 전체적으로 분석하여 변환하므로 많은 시간이 소요된다.

하지만 변환 과정을 한 번만 거치면 항상 실행 파일을 수행할 수 있고, 또한 프로그램을 최적화 할 수 있기 때문에 프로그램의 실행 속도가 빠르다.


컴파일러 vs 인터프리터


반응형
반응형

Comparator 를 이용한 문제 

Compartor 안에 조건문을 걸어주고 return 시켜 주면 이중, 삼중으로 정렬 할 수 있다.

return 값에서 x,y 부분을 반대로 바꿔주면 [오름차순 <-> 내림차순] 으로 바꿀 수 있다.


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
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
 
public class Main {
 
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        String[][] arr = new String[N][4];
        for (int i = 0; i < N; i++) {
            arr[i] = br.readLine().split(" ");
        }
        
        //Comparator 사용
        Arrays.sort(arr, new Comparator<String[]>() {
            @Override
            public int compare(String[] s1, String[] s2) {
                if (Integer.parseInt(s1[1]) == Integer.parseInt(s2[1])) {
                    if (Integer.parseInt(s1[2]) == Integer.parseInt(s2[2])) {
                        if (Integer.parseInt(s1[3]) == Integer.parseInt(s2[3])) {
                            
                            //국영수 점수가 같다면 사전 오름차순
                            return s1[0].compareTo(s2[0]);
                        }
        
                        //국어점수 같고 영어점수 같을 때, 수학 점수는 내림차순
                        return Integer.compare(Integer.parseInt(s2[3]), Integer.parseInt(s1[3]));
 
                    }
                    //국어 점수 같을 때, 영어 점수는 오름차순
                    return Integer.compare(Integer.parseInt(s1[2]), Integer.parseInt(s2[2]));
                }
                //국어점수는 내림차순
                return Integer.compare(Integer.parseInt(s2[1]), Integer.parseInt(s1[1]));
            }
 
        });
        for (int i = 0; i < N; i++) {
            System.out.println(arr[i][0]);
 
        }
    }
}
cs


반응형
반응형

알고리즘 분류로 정렬 문제를 풀고있는데 이문제는 정렬의 문제가 아닌거 같다.

가장 중요한건 long 변수를 사용해야 한다는 점?

2중 반복문으로 전체를 계산했기 떄문에 시간 성능 나쁘다.

정렬을 하나 마나 똑같을 테고..

좀 더 빠른 방법이 있긴 할텐데..

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
import java.io.FileInputStream;
import java.util.*;
 
public class Main {
    public static void main(String args[]) throws Exception {
        // Scanner sc = new Scanner(System.in);
        Scanner sc = new Scanner(new FileInputStream("input.txt"));
        int N = sc.nextInt();
        // 0 이상 1,000,000,000 이하의 정수 이기떄문에 long 변수 사용
        long[] arr = new long[N];
        long sum = 0;
 
        for (int i = 0; i < N; i++) {
            arr[i] = sc.nextLong();
        }
 
        // 정렬 안했고 2중 반복문을 통해서 절대값으로 처리해서 계산했다.
        // i == j 일때 처리하지 않은 이유는 어차피 arr[i] - arr[j] 는 0이 되기 때문
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                sum += Math.abs(arr[i] - arr[j]);
            }
        }
        System.out.println(sum);
    }
}
 
cs


반응형

+ Recent posts