algorithm

(230517) 알고리즘 - Stack(스택) / DB

hjkeeeem 2024. 7. 25. 20:28

1. 알고리즘

1-1. Stack(스택)

1-1-1. 합성함수 f o g()

1-1-2. 실제 호출 예제

 

1-2. Stack의 구현

1-2-1. 스택 기능

1-2-2. push() 구현

1-2-3. pop() 구현

1-2-4. isEmpty() 구현

1-2-5. isEmpty() ture일 때 pop 처리

1-2-6. peek() 구현

 

2. MySQL

2-1. DB

2-1-1. 스키마 생성

2-1-2. Table 생성

2-1-2. Drop Table

 

 

 

 

1. 알고리즘

1-1. Stack ( 스택 )

- 스택 (Stack) : 휴지와 감자칩, 나중에 들어온 것이 먼저 빠지는 자료구조 (Last In First Out)

- 큐 (Queue) : 대기 줄 , 먼저 온 것이 먼저 빠지는 자료구조 (First In First Out)

 

JVM -> Stack 영역

primitive type 변수도 Stack 영역

 

1-1-1. 합성함수 f o g()

g함수를 연산한 결과를 f함수에

 

plus() -> minus() -> multiple()

plus(minus(30, multiple(4 * 5)) , 20) = plus(10, 20)

Empty push push push pop → multiple()
      multiple()  
    minus() minus() minus()
  plus() plus() plus() plus()

 

1-1-2. 실제 호출 예제

isPrime(Integer.parseInt(sc.next()));

Empty push push push
      sc.next()
    Integer.parseInt() Integer.parseInt()
  isPrime() isPrime() isPrime()

 

예제 - “()(()))(())” 이 괄호는 짝이 맞는 괄호인지 맞으면 True, 아니면 False를 리턴하는 알고리즘

 

 

1-2. Stack의 구현

1-2-1. Stack 기능

.push() : 스택의 맨 위에 넣는 기능

.pop() : 맨 위에서 꺼내고 없애는 기능 

.peek() : 맨 위의 값을 확인하는 기능 (없애지 않음)

.isEmpty() : 비어있는지 check 하는 기능

 

 

 

1-2-2 .push() 구현

 

int[] arr = new int[10000]; – Stack Overflow

.push(int value)

array는 길이가 정해져 있다. stack은 array를 확장한 기능이며 array로 구성해야 속도면에서 빠른 장점이 있다.

public class Stack1 {
    private int[] arr = new int[10]; //미리 메모리 할당 가능
    private int pointer = 0;
    public void push(int value) {
        this.arr[pointer++] = value; //push기능
        System.out.println(Arrays.toString(arr));
        System.out.println("pointer : "+pointer);
    }
    public static void main(String[] args) {
        Stack1 st = new Stack1();
        st.push(10);
        st.push(20);
    }
}

push()는 value를 받아서 arr에 넣는 기능을 합니다.

arr에 1개씩 pointer를 늘리면서 넣기 위해 pointer++연산을 추가 합니다.

시작을 -1에서 출발 했으면 this.arr[idx] = value보다 pointer++를 먼저 씁니다.

+ push(int value) array[0]에 value를 넣는 기능으로 array를 return

 

 

 

1-2-3. pop 구현

주의사항 : 배열의 인덱스 번호를 변수 선언할 때 해당 변수가 꺼낼 때 기준인지, 넣을 때 기준으로 할 것인지 주의해야 한다.

해당 코드는 넣는 기준으로 작성

public class Stack1 {
    private int[] arr = new int[10]; //미리 메모리 할당 가능
    private int pointer = 0;
    public void push(int value) {
        this.arr[pointer++] = value; //push기능 //값이 들어올 때마다 pointer++ 값이 들어올 때마다 순서대로 배열 인덱스가 늘어야 하니까
        System.out.println(Arrays.toString(arr));
        System.out.println("pointer : "+pointer);
    }
    public int pop(){
        int temp = this.arr[pointer-1];
        pointer--;
        return temp;
        //return this.arr[--pointer]; 로도 사용 가능
    }
    public static void main(String[] args) {
        Stack1 st = new Stack1();
        st.push(10);
        st.push(20);
        // push로 들어갈 땐 10,20 순서로 들어갔지만 나올 땐 20, 10 순서로 나옴
        System.out.println(st.pop()); //20이 나옴 
        System.out.println(st.pop()); //10이 나옴
    }
}

temp라는 변수 하나를 만들어 this.arr[pointer-1] 값을 temp에 저장하고 (내뱉을 값) 

pointer를 -- 시켜준다. 그렇게 되면 이미 push로 인해 2의 값을 갖고 있는 pointer가 0까지 내려오게 된다.

그렇게 나중에 들어간 값이 가장 먼저 나오게 되는 pop기능을 구현할 수 있게 된다.

 

 

1-2-4. isEmpty() 구현

 

배열의 값이 비어있을 때 - true

배열의 값이 존재할 때 - false

public class Stack1 {
    private int[] arr = new int[10]; //미리 메모리 할당 가능
    private int pointer = 0;
    public void push(int value) {
        this.arr[pointer++] = value; //push기능 //값이 들어올 때마다 pointer++ 값이 들어올 때마다 순서대로 배열 인덱스가 늘어야 하니까
        System.out.println(Arrays.toString(arr));
        System.out.println("pointer : "+pointer);
    }
    public int pop(){
        int temp = arr[pointer-1];
        pointer--;
        return temp;
        //return this.arr[--pointer]; 로도 사용 가능
    }
    public boolean isEmpty() {
        return this.pointer == 0;
    }
    public static void main(String[] args) {
        Stack1 st = new Stack1();
        
        System.out.println(st.isEmpty()); // true
        st.push(30); // 30이 들어감. pointer = 1
        System.out.println(st.isEmpty()); // false
        System.out.println(st.pop()); // arr에 있는 30 빼버림
        System.out.println(st.isEmpty());//true
    }
}

배열의 인덱스 번호이자 몇개의 값이 들어있는지 표현되는 pointer가 0이되었을 때 true를 return한다는 isEmpty() 메소드 생성

 

 

 

1-2-5. isEmpty가 true일 때 pop처리

배열이 비어있을 때 (isEmpty) 그 상태에서 한번 더 pop메소드 사용 시 뜨는 에러 문구 처리

public int pop(){
        if(isEmpty()) throw new RuntimeException("스택이 비었습니다.");
        int temp = arr[pointer-1];
        pointer--;
        return temp;

if(isEmpty()) throw new RuntimeException("") 을 추가해 처리해준다.

 

 

1-2-6. peek() 구현

 

배열의 마지막 값 (pointer-1)을 확인해주는 기능으로 없애지 않고 정말 확인만 해준다.

 public int peek(){
        return this.arr[pointer-1];
    }
    public static void main(String[] args) {
        Stack1 st = new Stack1();

        st.push(10);
        st.push(20);
        System.out.println(st.peek()); // pointer - 1 인덱스 값이 출력, 가장 마지막 값 출력
        st.pop(); // [10,20,0,0,0,0,0,0,0,0] -> [10,0,0,0,0,0,0,0,0,0]
        System.out.println(st.peek()); // 10출력
    }
}

 

isEmpty일 때 (값이 없을 때)

    public int peek(){
        if(isEmpty()) throw new RuntimeException("스택이 비어있습니다.");
        return this.arr[pointer-1];
    }
    public static void main(String[] args) {
        Stack1 st = new Stack1();
        System.out.println(st.peek());
    }
}

예외처리를 해주어 empty 상황에 peek으로 확인 했을 때 어떻게 뜨는지도 처리 해준다.

 

2. MySQL Workbench

2-1. DB

2-1-1. 스키마 생성

 

 

2-1-2. Table 생성

db가 생성된 후 Tables -> Create Table 

사진과 같이 설정 후 Apply > Table 생성 완료

 

 

2-1-3. Drop Table

 

 

2-1-5. INSERT

 

방법 1. table에서 우클릭 > Select Rows - Limit 1000

칸을 더블 클릭 하여 값을 넣을 수 있음

 

 

방법2. SQL문 작성

INSERT INTO `likelion-db`.`book` (`bookid`, `bookname`, `publisher`, `price`) VALUES ('2', '모두의 축구', '멋사출판사', '8000');

SQL 작성 후 cmd + enter 

 

 

2-1-6. Select

: 다음의 구문으로 book 테이블의 모든 컬럼을 조회할 수 있다.

SELECT * FROM book;

 

use 사용법

: use를 사용하면 원래 입력되어야 할 select * from `likelion-db`.book 이라고 적어야 할 것을 다음 구문과 같이 사용 가능하다.

  (use 사용 시 바로 select * from book 사용 가능)

use `likelion-db`;
SELECT * FROM book limit 500;/*전체에다 셀렉*/

 

Select Where

: 'where' 구문 사용 시 특정 조건에 맞는 레코드만 검색할 수 있다. 다음은 price(가격)이 8000과 같거나 보다 높은 컬럼 출력

SELECT bookname, publisher FROM book WHERE price >= 8000;

 

Like 검색

:

select * from book where bookname like "%축구"; /*축구로 끝나는 */
select * from book where bookname like "%축구%";/*축구를 포함하는*/
select * from book where bookname like "축구%"; /*축구로 시작하는 */

%축구
%축구%
축구%

 

 

IN

: Where절에서 사용하며, 지정된 값 목록 중 하나라도 해당하는 레코드 반환

select * from book where publisher IN ('굿스포츠','대한미디');

 

 

2-1-7. DELETE

: 데이터베이스에서 특정 레코드를 지우기 위한 구문이며, where를 이용해 특정 조건에 맞는 레코드를 삭제할 수 있다.

DELETE FROM ‘book’;
DELETE FROM ‘book’ WHERE bookname = ‘축구의 역사’;

 

 

2-1-8. UPDATE

: 데이터베이스에서 특정 레코드 값을 업데이트하는 구문이다. 

update book set publisher = "글빛" where bookid = 2;
select * from book; /* 글빛으로 바뀌었는지 확인 */

update book set publisher = "글빛"; 은 전부 바뀌게 되는거라 workbench에서 막아놓은 듯 하다. (사용 불가)

 

 

2-1-8. JOIN

Auto Incremental : PK를 순서대로 부여

Table 나누기 > publisher Table 생성 > book Table 수정 > Join

 

publisher 테이블 생성

CREATE TABLE `likelion-db`.`publisher` (
  `publisherid` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `address` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`publisherid`));

 


book 테이블 수정

book 테이블 우클릭 > Alter Table...

기존의 publisher 컬럼을 우클릭 > delete selected 로 제거한 뒤 publisherid 를 생성합니다.

ALTER TABLE `likelion-db`.`book` 
ADD COLUMN `publisherid` INT NULL AFTER `price`;

 

 

select SQL 구문으로 테이블이 수정된 것을 확인

publisher Table

SELECT * FROM `likelion-db`.publisher;

 

book Table

SELECT * FROM `likelion-db`.book;

 

 

JOIN

 

분리된 테이블을 JOIN 한다.

select * from book, publisher; /*조인 걸기 : from 에다가 table 두개 걸기 */

책은 두 권인데 4줄이나 나왔습니다. 

 

 

중복제거

where를 이용해 publisher.publisherid = book.publisherid; 구문을 추가해 JOIN 시켜준다.

select * from book, publisher where publisher.publisherid = book.publisherid;

publisher의 publisherid와 book의 publisherid가 같은 것만 보여주는 쿼리이다.

 

use `likelion-db`;
SELECT * FROM book limit 500;/*전체에다 셀렉*/

select bookname, publisher, price from book where price >= 7000; /*7000원 이상인 책*/

select * from book where bookname like "%축구"; /*축구로 끝나는 */
select * from book where bookname like "%축구%";/*축구를 포함하는*/
select * from book where bookname like "축구%"; /*축구로 시작하는 */

select * from book where publisher IN ('굿스포츠','대한미디');

update book set publisher = "글빛" where bookid = 2;
select * from book;
SELECT * FROM `likelion-db`.publisher;
select * from `likelion-db`.book;

select * from book, publisher; /*조인 걸기 : from 에다가 table 두개 걸기 */
select * from book, publisher where publisher.publisherid = book.publisherid;

select bookname, publisher.name, publisher.address from book, publisher
where book.publisherid = publisher.publisherid and bookname = "모두의 축구";