라멘이랑 맥주 조합 최공 🥰
'Diary' 카테고리의 다른 글
선릉 착한고기 (4) | 2019.01.31 |
---|---|
역삼 민들레떡볶이 (3) | 2019.01.30 |
역삼 전봇대 (2) | 2019.01.23 |
역삼 광역시맥주8220 (1) | 2019.01.12 |
유스토리 블로그 테스트 (1) | 2019.01.09 |
라멘이랑 맥주 조합 최공 🥰
선릉 착한고기 (4) | 2019.01.31 |
---|---|
역삼 민들레떡볶이 (3) | 2019.01.30 |
역삼 전봇대 (2) | 2019.01.23 |
역삼 광역시맥주8220 (1) | 2019.01.12 |
유스토리 블로그 테스트 (1) | 2019.01.09 |
프로세스 : 실행중인 프로그램
프로그램 : 만들어졌는데 아직 실행되지 않고 하드디스크에 저장된 상태
스레드 : 프로세스를 실행시켜 준다.
main이 쓰레드다. main이 없으면 실행 안됨.
멀티쓰레드의 장/단점
running 이후 할당된 시간이 끝나면 다시 runnable 상태로 대기줄에 서게된다.
yield()
running에서 양보하라고 메소드를 호출할 수 있다.
runnable 대기큐를 체크해서 자기보다 우선순위가 높거나 같은애가 있다면 양보한다.
우선순위가 높은애가 없으면 양보하지않는다.
< Thread를 만드는 방법 두가지 >
xxxxxxxxxx
public interface Runnable{
public abstract void run();
}
public class Thread implements Runnable{
...
}
xxxxxxxxxx
class MyThread extends Tread{
public void run(){
~~~
}
}
Thread t3 = new MyThread();
if ) 어떤 클래스에서 thread를 써야겠다.
-> 아무것도 상속받지 않은 상태라면 implements도 되고, 상속도 됨.
-> 어떤 클래스를 상속하고 있다면 implements만 가능
(공통) 쓰레드가 해야하는 작업내용이 들어있는 메소드를 만들어놔야한다.
x
package com.thread;
//Thread 클래스 상속받는 방법
class Tiger extends Thread{
//callback method : 사용자에 의해 직접 호출되지 않지만 특정 조건이 되면 자동 실행되는 메소드
//thread가 수행해야 할 작업 내용을 갖는 메소드
public void run() {
System.out.println("thread is running!" + getName());
}
}
public class TigerTest {
public static void main(String[] args) {
Tiger t1= new Tiger(); //t1은 thread다
t1.start(); //thread에게 작업 시작을 알리는 메소드
/*
* 직접적으로 run을 호출하지 않는다.
* start를 호출하면 알아서 run을 찾아간다.
* */
//t1.run();
Tiger t2= new Tiger(); //t1은 thread다
t2.start();
Tiger t3= new Tiger(); //t1은 thread다
t3.start();
Tiger t4= new Tiger(); //t1은 thread다
t4.start();
}
}
/**
*t1.start()
*main thread가 start() 만 수행하고 (스레드 시작 버튼 )
*run은 tiger thread가 수행.
*
*t1.run()
*main이 run을 수행.
*==> context switching
*
*/
xxxxxxxxxx
main(){
first();
}
first(){
second();
}
second(){ //callback method
~~~~
}
x
package com.thread;
//Runnable을 구현하는 방법
//thread가 수행해야 할 작업 내용을 갖는 메소드
class Lion implements Runnable{
//Lion 은 Runnable 타입(종류)다.
//하지만, thread는 아니다.
public void run() {
System.out.println("Thread is running..."+Thread.currentThread().getName());
}
}
public class LionTest {
public static void main(String[] args) {
Lion l1 = new Lion(); // thread는 아니다.
//대신 Runnable 객체. thread가 수행해야 하는 작업 메소드 run()은 가지고 있음.
Thread t1 = new Thread(l1); //l1의 run()을 실행하러감.
t1.start();
Thread t2 = new Thread(l1); //l1의 run()을 실행하러감.
t2.start();
Thread t3 = new Thread(l1); //l1의 run()을 실행하러감.
t3.start();
}
}
<실행결과>
xxxxxxxxxx
Thread is running...Thread-0
Thread is running...Thread-2
Thread is running...Thread-1
Thread객체 생성시 parameter로 Runnable 타입의 객체를 받을 수 있다.
main thread 실행
**) main thread가 우선순위가 더 높기때문에 default상태로는 먼저 실행
package com.thread;
public class MainThreadTest implements Runnable {
MainThreadTest() {
//thread를 생성하고, start
Thread t = new Thread(this);
t.start();
try {
t.join(); //t를 기다려줌 (main이)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MainThreadTest m = new MainThreadTest();
m.go();
}
public void go() {
System.out.println("gogo");
}
public void run() {
System.out.println("run by thread..");
}
}
[java 예외처리]Try-with-resources (2) | 2019.07.11 |
---|---|
java tip (0) | 2019.02.18 |
[java] 예외처리 (2) | 2019.01.24 |
[java] Collection 활용 (0) | 2019.01.17 |
[java] interface (0) | 2019.01.16 |
메소드 선언할때는 throw
실제로 사용할떄는 throws
stream
1. 입력용 - InputStream(데이터 읽어오는 스트림)
출력용 - OutputStrema(데이터 출력하는 스트림)
2. 데이터 전송 단위
bytue Stream(1 byte에 코드값을 담아 전송하느 스트림); InputStream/OutputStream
character Stream(2 byte에 코드값을 담아 전송하느 스트림); Reader / Writer
3. 데이터와의 연결 여부
Node Stream(데이터와 직접 연결되어 있는 스트림)
Process Stream(Filter Stream) Node Stream으로부터 데이터를 받아 가공하는 스트림
접근지정자
자식이 범위가 더 커지는건 ok
좁아지는거 안됨
예외처리
자식이 더 큰 예외를 throw하면 안됨.
메소드 이름 선언할때는 throws
실제로 발생시킬 때는 throow
java tip (0) | 2019.02.18 |
---|---|
[java] 쓰레드(Thread) (0) | 2019.01.24 |
[java] Collection 활용 (0) | 2019.01.17 |
[java] interface (0) | 2019.01.16 |
[Java] final, static (0) | 2019.01.16 |
얻어걸린 맛집
담엔 막걸리 먹는다 무족건
역삼 민들레떡볶이 (3) | 2019.01.30 |
---|---|
역삼 호타루 (2) | 2019.01.25 |
역삼 광역시맥주8220 (1) | 2019.01.12 |
유스토리 블로그 테스트 (1) | 2019.01.09 |
사이트맵 (0) | 2019.01.08 |
순차적 접근속도 가장 빠름.
비순차적 삽입/삭제
크기 변경 불가
순서가 있으므로, 데이터의 중복 허용.
ArrayList
내부적으로 배열로 구현
배열크기 변경 가능. --> 크기를 미리 모를때 사용
순차적
LinkedList
Node로 구현
비순차적 삽입/삭제에 최적
접근성이 떨어진다. (인덱스가 없으므로 처음부터 하나씩 방문해야 함)
순서가 없다.
주머니에 구슬을 넣는 모양. (중복된 데이터를 넣으면 구분이 불가능하므로 허용하지 않는다.)
중복불가. 중복된 데이터가 삽입 시도 -> 원래 데이터만 살아남고 중복된 데이터 삽입 불허.
HashSet
hasing기법을 사용해 중복 체크 O(1)
데이터가 많을떄 빠르게 검색할수 있는 가장 좋은 자료구조
TreeSet
Binary Search Tree로 중복 체크 O(logN)
정렬을 자주 실행해야 하는 경우.
키 : 값
"바나나" : 5000
"사과" : 5000
key로 값을 구분할 수 있기 때문에 중복허용
단, key는 중복될 수 없다.
만약 중복 키가 들어오면 --> 덮어쓰기. (기존데이터 지우고) <Set과 비교>
왜? 키는 중복되더라도 새로운 데이터가 있을수 있기 때문.
HashMap
데이터가 많을떄 빠르게 검색할수 있는 가장 좋은 자료구조
TreeMap
정렬을 자주 실행해야 하는 경우.
해시테이블 Hashtable (2) | 2019.05.06 |
---|---|
Merge Sort 병합정렬 (4) | 2019.01.29 |
문제 >> 1809 : 탑
- 탑의 정보를 담는 클래스 Tower. 탑의 번호(number)와 높이(size)를 저장.
- 최종 출력할 답을 담을 list
- 입력 순서대로 스택에 넣어준다.
- 이 때 스택이 비어있다면, 현재 탑의 레이저를 수신할 수 있는 장치는 없다. ==> list에 0을 넣어준다. list.add(0)
- 스택이 비어있지 않다면 ..
가장 위에 담아있는 tower의 정보를 peek 한다.
만약 peek 한 tower의 size가 현재 탑보다 작다면, pop한다. (현재 tower의 높이가 더 높기 때문에, 앞으로 어떤 탑의 레이저도 수신할 수 없다.
현재 탑의 size보다 큰(즉, 현재 탑의 레이저를 수신할 수 있는) tower가 나올때까지 pop을 반복한다.
현재 탑의 size보다 큰 tower를 만나면, 그 tower의 number를 list에 add 해주고, 현재 탑을 push 해준다.
만약 pop을 반복하다 스택이 비면, 현재 탑의 레이저를 수신할 수 있는 탑이 없다는 뜻이므로, list에 0을 add해주고 현재 탑을 스택에 push한다.
- 최종 list를 출력한다.
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 | import java.util.ArrayList; import java.util.Scanner; import java.util.Stack; class Tower { int number; int size; public Tower(int number, int size) { this.number = number; this.size = size; } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //int T = sc.nextInt(); //for(int t=1;t<=T;t++) { Stack<Tower> stack = new Stack<>(); ArrayList<Integer> list = new ArrayList<>(); int N= sc.nextInt();// 탑의 수 int now=0; // 탑의 높이 int idx=0; //int[] ans = new int[N]; //answer for(int i=0;i<N;i++) { now = sc.nextInt(); if(stack.empty()) list.add(0); // 스택이 비어있으면 앞에 건물이 현재건물now보다 낮은 건물이거나 처음으로 넣는 건물 else { while(!stack.empty()) { if(stack.peek().size < now ) { // 스택에 있는 건물이 지금 넣으려는 건물보다 낮으면 pop stack.pop(); if(stack.empty()) list.add(0); // 낮은 건물은 계속 pop하다가 스택이 비어 있으면 리스트에 0을 추가 } else { list.add(stack.peek().number); // 스택에 있는 건물이 지금 넣으려는 건물보다 높으면 그 값을 list에 추가 break; } } } stack.push(new Tower(++idx,now)); } //System.out.print("#"+" "); for(int i=0;i<list.size();i++) { System.out.print(list.get(i)+" "); } System.out.println(); //} } } | cs |
[BOJ] 6588 : 골드바흐의 추측 (0) | 2019.02.08 |
---|---|
[BOJ]1389: 케빈 베이컨의 6단계 법칙 (0) | 2019.02.08 |
5432. 쇠막대기 자르기 (0) | 2019.01.15 |
1218. [S/W 문제해결 기본] 4일차 - 괄호 짝짓기 (0) | 2019.01.15 |
[BOJ] 1018 : 체스판 다시 칠하기 (0) | 2019.01.11 |
순열 흐름도
n P k
재귀함수 종료조건 if( len == k )
즉 고른 숫자의 길이가 K일때 함수 종료.
흐름도에서 밑으로 레벨이 한단계 깊어질 수록 len이 +1 된다.
k = 1이면 len=1까지 (1레벨)만 진행되고,
k = 4일때 (즉 , 4 P 4 ) 일때 가장 깊은 레벨까지 재귀함수가 실행된다.
종료 조건 안의 배열 print는 len==k 길이 만큼 된다.
크기가 4인 배열의 함수에 숫자가 들어있어도 len(=k)만큼만 출력된다.
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 | #include <iostream> #include <memory.h> int n = 2; //n개를 골라라 int m = 4; //인덱스범위 int arr[4]; int idx[4]={0,1,2,3}; void permutation(int len){ if(len == n){ for(int i=0 ;i<len;i++){ printf("%d ", idx[i]); } printf("\n"); return; } for(int i=len;i<m;i++){ swap(i,len); permutation(len+1); //len을 증가시키기 위함 swap(i,len); } } int main(int argc, const char * argv[]) { permutation(0); return 0; } | cs |
[java] Dijkstra 다익스트라 알고리즘 (0) | 2019.02.19 |
---|---|
Kruskal 크루스칼 알고리즘 (0) | 2019.02.18 |
DisjointSets (0) | 2019.02.18 |
[java] Insertion Sort 삽입정렬 (0) | 2019.01.28 |
Dijkstra 최단경로 알고리즘 (2) | 2019.01.08 |
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 | jpackage com.util; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class CollectionTest { public static void main(String[] args) { List fruits = new ArrayList<>(); // fruits.add("apple"); // fruits.add("orange"); // fruits.add("banana"); //1.addAll Collections.addAll(fruits, "apple","orange","banana"); //2. sort Collections.sort(fruits); System.out.println(fruits.toString()); //3. search Collections.sort(fruits); System.out.println(Collections.binarySearch(fruits, "banana")); System.out.println(Collections.binarySearch(fruits, "grape")); //4. copy List list = new ArrayList(); Collections.addAll(list, "one","two","three","four"); Collections.copy(list, fruits); System.out.println(list.toString()); //5. fill Collections.fill(list, "filled with dummy data"); System.out.println(list.toString()); } } | cs |
[java] 쓰레드(Thread) (0) | 2019.01.24 |
---|---|
[java] 예외처리 (2) | 2019.01.24 |
[java] interface (0) | 2019.01.16 |
[Java] final, static (0) | 2019.01.16 |
JAVA 입출력 (2) | 2019.01.08 |