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 = "모두의 축구";
'algorithm' 카테고리의 다른 글
[Programmers] [코딩테스트 입문] 최댓값 만들기, 삼각형의 완성조건, 문자열 안에 문자열 (0) | 2024.09.03 |
---|---|
[Programmers] [코딩테스트 입문] 두 수의 나눗셈, 특정 문자 제거하기 (1) | 2024.09.03 |
(230619) Queue (0) | 2024.09.03 |
(230518) 알고리즘 - 괄호풀기 / DB (0) | 2024.07.25 |
(230516) 알고리즘 - 삽입 정렬 (0) | 2024.07.25 |