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
 
public class Main {
 
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        //혼자 접근을 하려 했지만 지속적인 실패로 인해 다른분거 참조!
        //코드가 예술이네요...
        
        //몇번째 숫자를 출력할지 결정하는 변수 n
        int n = Integer.parseInt(br.readLine());
        
        //첫번째행은 1/1, 두번째는 1/2, 2/1, 세번째는 3/1, 2/2, 1/3
        //이런식으로 행마다 숫자가 하나씩 늘어난다
        //규칙적으로 늘어나는 것은 등차수열이며, 등차수열 법칙을 젹용해본다
        //몇번째 행을 결정하는 line
        int line = 0;
        //그 행까지 몇까지 숫자가 있는지 결정하는 cnt
        int cnt = 0;
        //cnt가 n보다 클때까지 돌린다
        while (cnt < n) {
            line++;
//            System.out.println(cnt + " < " + n);
//            System.out.println("line" + line);
            //이렇게 등차수열 공식을 사용하면 해당 행에 총 몇개의 수가 있는지 확인 할 수 있다
            cnt = line * (line + 1/ 2;
//            System.out.println("cnt" + cnt + "\n");
        }
        
        //보다시피 지그재그 순으로 line이 짝수면 우측에서 좌측으로, 홀수면 좌측에서 우측으로 올라간다
        //그래서 이프엘스
        if(line % 2 == 0) {
            int top = line - (cnt - n);
            int bottom = 1 + (cnt - n);
            bw.write(top + "/" + bottom);
        } else {
            int top = 1 + (cnt - n);
            int bottom = line - (cnt - n);
            bw.write(top + "/" + bottom);
        }
        //내려줍니다 
        bw.flush();
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

'알고리즘' 카테고리의 다른 글

백준 8단계(10250)  (0) 2019.12.15
백준 8단계(2869)  (0) 2019.12.15
백준 8단계(2292)  (0) 2019.12.14
백준 8단계(2839)  (0) 2019.12.14
백준 8단계(1712)  (0) 2019.12.10
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
import java.util.Scanner;
 
public class Main {
    
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        
        // 1
        // 7 = 1 + 6
        //19 = 7 + 6 + 6
        //37 = 19 + 6 + 6 + 6
        //61 = 37 + 6 + 6 + 6 + 6
        int i = 1;
        int roomNum = 1;
        int addNum = 6;
        while(true) {
            if(n <= roomNum) break;
            roomNum += addNum;
            addNum += 6;
            i++;
        }
        System.out.println(i);
        
        //밑에 있는 방식도 위에 있는거랑 똑같은데.. 너무 내가 문제를 복잡하게 생각했다
//        if(n != 1) {
//            int a = 1;
//            for(i = 0; i < 10; i++) {
//                int second = a;
//                int first = 6 * (i + 1) + second;
////                System.out.println(i);
////                System.out.println(first + " " + second);
//                if(second < n && n <= first) {
//                    i++;
//                    break;
//                }
//                a = first;
//            }
//        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

'알고리즘' 카테고리의 다른 글

백준 8단계(2869)  (0) 2019.12.15
백준 8단계(1193)  (0) 2019.12.14
백준 8단계(2839)  (0) 2019.12.14
백준 8단계(1712)  (0) 2019.12.10
백준 7단계(1316)  (0) 2019.12.10
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.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        //n이 5로 나눴을때 0이면 n/5출력하면되는데
        //n이 5로 다 나눠지지 않고, 19인경우 5와 3의 조합을 찾아야한다
        if(n % 5 == 0) {
            System.out.println(n/5);
            return;
        } else {
            //quotient, 19/5는 3이며, 3부터 1까지 n이랑 빼서 3으로 나눠지는지 확인을 한다
            //이렇게 해야 최고의 조합을 찾을 수 있다
            int quotient = n/5;
            //3부터 ~ 1까지 가는 포문
            for(int i = quotient; i > 0; i--) {
                //temp에 저장을 해둔다
                int temp = n - i * 5;
                //만약 temp가 3으로 나눠지면
                if(temp % 3 == 0) {
                    //i와 temp/3의 값과 더하면 bag이 몇개가 필요한지 알 수 있다
                    System.out.println(i + temp/3);
                    return;
                }
            }
        }
        
        //만약 5와 3의 조합을 못찾았다는 뜻은 3으로 나눠질 수 있던지 아니면 숫자 
        //자체가 bag안에 담을 수 없는 숫자인 것이다. 
        //3으로 나눠진지 확인을 한다
        if(n % 3 == 0) {
            System.out.println(n/3);
            return;
        } else {
            //만약 다 안되면 -1로 출력을 한다 
            System.out.println(-1);
            return;
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

'알고리즘' 카테고리의 다른 글

백준 8단계(1193)  (0) 2019.12.14
백준 8단계(2292)  (0) 2019.12.14
백준 8단계(1712)  (0) 2019.12.10
백준 7단계(1316)  (0) 2019.12.10
백준 7단계(2941)  (0) 2019.12.10

GENERIC

Generic은 타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 한다

-      컴파일시 강한 타입 체크를 할 수 있다

-      타입변환을 제거할 수 있다. 기본적으로 object타입으로 저장을 하는데, 만약 스트링으로 사용하고 싶으면 형변환을 해야한다. 하지만 제너릭을 사용하면 처음부터

 

<? extends 클래스> = 상위에 있는 클래스들에 대한 제한

<? Super 클래스> = 하위 클래스에 있는 클래스 제한

Generic를 통한 배열을 선언할때는 new int[10] 이렇게 하면 에러가 난다. 왜냐하면 확정이 안된 타입의 변수는 선언이 불가능해서, object타입으로 선언을 해주고, 제너릭 타입으로 형변환을 시켜주면 된다.

Ex. (T)(new Object[capacity])

프로세스는 운영체제에서 할당받은 메모리를 가지고 실행합니다.

스레드는 프로세스안에서 작업을 실행하는 역할을 가지고 있습니다.

멀티프로세스 개념은 여러개의 프로세스를 가지고 있지만 서로 연관이 안되어있어서 프로세스에 에러가 발생해도 다른 프로세스는 문제 없이 작동합니다. Ex. 워드를 사용하다 오류때문에 종료를 해야되지만 엑셀은 지속적으로 사용가능한 상황.

반면 멀티스레드는 하나의 프로세스안에서 실행이되기 때문에 만약 하나의 스레드에 문제가 발생하면 다른 스레드에도 영향을 끼칩니다. Ex. 메신저어플에서 파일을 보내다가 문제가 생기면 메신저 통채로 종료되는 현상.

 

어떤 자바 애플리케이션이건 메인 스레드는 반드시 존재한다. 자바에서는 작업 스레드도 객체로 생성된다. Java.lang.Thread를 직접 객체화해도 되고 또는 상속해서 하위클래스를 사용해도 된다.

1.     Implement Runnable

2.     Extends Thread

Thread Runnable 매개값으로 받아야한다. 그래서 실행할 클래스에서 상속해서 대입할 수 있고 또는 익명객체형식으로 바로 구현이 가능하다. Runnable은 함수적 인터페이스여서 람다식방식도 가능하다.

구현을 하고나서 스레드를 실행시킬려면 .start()메소드를 사용해야 실행이된다.

Thread는 기본적으로 자기이름 + n번호를 가지고 있다. setName통해서 이름은 재정의가 가능하다.

 

멀티스레드는 동시성(Concurrency) 또는 병렬성(Parallelism)으로 실행된다.

동시성은 하나의 코어에서 멀티 스레드가 번갈아가면서 실행하고 병렬성은 멀티 코어에서 개별 스레드를 실행한다. 싱글 cpu는병렬적으로 실행이되는 것 처럼 보이지만 빠른 동시성을 실행하는 것이다.

 

스레드를 어떤 순서로 실행할지 정하는 것이 스레드 스케줄링이라고 한다.

스케줄링은 우선순위(priority)방식 그리고 순환 할당(round robin)방식을 사용한다.

우선순위 방식은 우선순위가 높은 스레드를 실행 상태를 더 많이 가지게 하는 방식이다.

순환 할당은 시간 할당량(time slice!)을 정해서 하나의 스레드를 정해진 시간만큼 실행하고 다시 다른 스레드를 실행하는 방식이다.

Priority 방식은 코드로 제어할 수 있지만 round robin 순환 할당 방식은 jvm에서 정해지기 때문에 코드로 제어할 수 없다.

우선순위느 1~10, 1이 제일 낮고 10이 가장 높다. 기본 순위는 5로 할당이된다.

setPriority로 우선순위를 정할 수 있고, 가독성을 높이기 위해 상수를 사용해도 좋다.

쿼드 코어일 경우에는 4개의 스레드가 병렬성으로 실행이 되기 때문에 우선순위 방식이 크게 영향을 미치지 못한다. (현재 사용하는 노트북은 intel i7 9th gen, 8개의 코어를 가지고 있으니 8개의 스레드까지 병렬성으로 처리 가능하네)

 

싱글 스레드 프로그램에서는 객체를 독차지해도 되지만 멀티 스레드에서는 공유 객체를 사용하면 하나의 스레드에서 변경을 하면 다른 스레드에서 원하는 결과값이 안나올 수 도 있다.

 

멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역(critical section)이라고 한다. 자바에서 임계 영역을 지정하기 위해 동기화(synchronized)를 사용한다. 스레드가 동기화 메소드 및 블록을 사용하면 잠금을 걸어 다른 스레드가 임계 영역 코드를 실행 못하게 한다.

 

스레드는 바로 실행되는게 아니라 실행대기 상태에서 스케줄링을 기달린다.

New = 스레드 객체가 생성직전

Runnable = 언제든지 실행 가능한 상태

Waiting = 다른 스레드가 통지할 때까지 기다리는 상태

Timed_waiting = 주어진 시간 동안 기다리는 상태

Blocked = 사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태

Terminated = 실행을 마친 상태

 

Sleep()은 일시정지, interrupt()메소드가 호출되며 interruptedException이 발생해서 예외 처리가 필요하다.

 

Yield()은 다른 스레드한테 양보하는 메소드

Join()은 다른 스레드 종료를 기다리는 메소드

 

Wait()는 일시정지가 된다. 자기 스스로 실행대기로 못간다. 그래서 notify, notifyall를 사용하면 일시정지가 풀린다.

두 개의 스레드가 교대로 번갈아 가며 실행해야할 경우에 주로 사용한다.

동기화 블록 메소드에서만 호출 가능한 object메소드입니다!

스레드를 종료시킬때 stop를사용하면 자원들이 불안전한 상태로 남겨진다. 그래서 stop 플레그를 사용, while문을 통한 boolean를 사용하자. 하지만 이렇게 하면 일시정지한 스레드는 종료를 못한다. Interrupt()는 일시정지 상태에만! interruptedException이 발생해서 스레드를 종료시킨다. 즉 만약 실행상태일 경우에는 interruptedException이 발생하지 않아서 스레드를 종료를 못시킨다.

주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드가 데몬 스레드

Ex. 위드프로세서의 자동저장, 워드가 실행이 아닌 상태에서는 자동저장 스레드의 존재가 필요가 없다.

 

스레드그룹을 사용해서 스레드끼리 묶을수 있다. 스레드 그룹의 제일 큰 역할은 interrupt인데, interrupt를 한 그룹에 사용하면 모든 스레드는 정지가 된다.

 

스레드풀- 스레드가 많이 생성되면 cpu에 저하가 생겨서 이런 현상을 방지하기위해 미리 스레드풀이란걸 만든다. 스레드를 제한된 개수만큼 생성. 작업 큐에 들어오는 작업들을 하나씩 스레드가 맏아 처리한다.

 

스레드풀 = executeservice

Runnable은 작업 처리후 리턴 값이 없고, callable은 작업 처리후 리턴 값이 있다.

스레드풀에 작업처리 요청을 하기 위해선 runnable/callable로 실행을 시켜줘야한다.

executorService는 작업 큐에있는 객체들을 처리하기 위해 두가지 메소드를 실행할 수 있다, execute 그리고 submit.

Execute는 스레드가 종료되고 해당 스레드는 제거된다. 작업 처리를 위해 새로운 스레드를 생성한다.

Submit은 스레드가 종료되지 않고 다음 작업을 위해 재사용된다.

'ETC' 카테고리의 다른 글

The Shawshank Redemption review  (4) 2019.12.16
이것이 자바다 노트3(제너릭)  (1) 2019.12.14
이것이 자바다 노트1  (0) 2019.12.09
Garbage Collector  (0) 2019.12.01
Comparable vs Comparator  (0) 2019.12.01
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
 
public class Main {
 
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        try {
            String str = br.readLine();
            StringTokenizer st = new StringTokenizer(str);
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            
            //만약 변동값이 노트북판매 가격보다 높으면 절대 이익을 볼 수 없어서 손익분기점이 존재하지 않는다
            if(b >= c) bw.write(String.valueOf(-1));
            //이부분은 다른분들꺼를 참조했는데
            //시간제한때문에 포문을 사용하지 말고 수학적으로 구해야하는데
            //노트북판매가격 - 변동가격을 고정값이랑 나누고, 손익분기점은 수익이 발생하는 시점이여서 +1를 해준다
            else bw.write(String.valueOf((a/(c-b) + 1)));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if(br != null)try {br.close();catch (IOException e) {}
            if(bw != null)try {bw.close();catch (IOException e) {}
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

'알고리즘' 카테고리의 다른 글

백준 8단계(2292)  (0) 2019.12.14
백준 8단계(2839)  (0) 2019.12.14
백준 7단계(1316)  (0) 2019.12.10
백준 7단계(2941)  (0) 2019.12.10
백준 7단계(5622)  (0) 2019.12.10
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
 
public class Main {
 
    //그룹단어인지 체크해주는 메소드, O(n^2)가 맞겠죠
    public static int check(String str) {
        //리턴 값
        int p = 0;
        //나중에 str를 변경해야되서 temp하나 생성
        String temp = str;
        //만약 a면 바로 값 1 리턴, 그룹단어 체크
        if(str.length() == 1return 1;
        
        //재밌는 포문 시작, 머리 깨질번
        //i는 str 캐릭터 위치 확인하는 첫번째 위치
        //j는 str 캐릭터 2번째 위치
        for(int i = 0; i < str.length() - 1; i++) {
            for(int j = i + 1; j < str.length(); j++) {
                //만약 i랑 j가 똑같다
                //ex. aabb라면 0 1, 2 3
                if(str.charAt(i) == str.charAt(j)) {
                    // i번째와 j번째까지 substring에서 만약 해당 알파벳밖에 없다는 뜻은 그룹단어
                    if(str.substring(i, j).matches("^[" +str.charAt(i)+"]*$")) {
                        p = 1;
                    //만약 aabba면 첫번째 a(0) 와 a(4)이 위의 if문의 들어와서 중간에 a말고 다른 캐릭터가 있으면
                    //그룹단어가 당연히 아니니 바로 return 0으로 메소드 끝
                    } else {
                        return 0;
                    }
                //마지막까지 똑같은 캐릭터가 없다는 뜻은 그룹 단어란 뜻이다
                } else {
                    p = 1;
                }
            }
        }
        return p;
    }
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        //몇번 입력할지 결정하는 숫자
        int n = Integer.parseInt(br.readLine().trim());
        //그룹단어가 몇개인지 보여주는 변수
        int count = 0;
        //n까지 포문 
        for(int i = 0; i < n; i++) {
            //입력된 단어를 check메소드 파라미터에 대입, 만약 그룹단어이면 결과값 1, 그룹단어가 아니면 결과값 0
            count += check(br.readLine().trim());
        }
        //마지막 count를 출력하면 끝
        bw.write(String.valueOf(count));
        bw.flush();
        
        //한시간반
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

'알고리즘' 카테고리의 다른 글

백준 8단계(2839)  (0) 2019.12.14
백준 8단계(1712)  (0) 2019.12.10
백준 7단계(2941)  (0) 2019.12.10
백준 7단계(5622)  (0) 2019.12.10
백준 7단계(2908)  (0) 2019.12.10
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
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //str 입력 받은 문자열을 저장합니다
        String str = scan.next();
        //.*는 문자열 어디든 찾는다는 뜻이고
        //() 그룹ing해서 c=,c-등이 있는지 확인하는 패턴
        Pattern p = Pattern.compile(".*(c=|c-|dz=|d-|lj|nj|s=|z=).*");
        //Matcher클래스를 통해 만약 패턴이 스트링이랑 일치하는지 확인하는 클래스
        Matcher m = p.matcher(str);
        //만약 true로 나오면
        if(m.matches()) {
            //String안에있는 replaceAll메소드를 사용해서 해당 패턴들을 별로 교체
            str = str.replaceAll("c=|c-|dz=|d-|lj|nj|s=|z=""*");
        }
        
        //이렇게도 가능하지만 코드가 깔끔하지않아 찾던 결과 pattern을 사용해서 정규식 방식 사용
//        if(str.contains("[c=||c-]") || str.contains("c-") || str.contains("dz=") ||
//                str.contains("d-") || str.contains("lj") || str.contains("nj")||
//                str.contains("s=") || str.contains("z=")) {
//            str = str.replaceAll("c=|c-|dz=|d-|lj|nj|s=|z=", "*");
//            System.out.println("works");
//        } 
        
        //size 프린트하면 끝
        System.out.println(str.length());
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

'알고리즘' 카테고리의 다른 글

백준 8단계(1712)  (0) 2019.12.10
백준 7단계(1316)  (0) 2019.12.10
백준 7단계(5622)  (0) 2019.12.10
백준 7단계(2908)  (0) 2019.12.10
백준 7단계(1152)  (0) 2019.12.10

+ Recent posts