728x90

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

 

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

 

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

 

예제 입력
14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top
예제 출력
2
2
0
2
1
-1
0
1
-1
0
3

 

코드 및 설명
import sys
input=sys.stdin.readline

n=int(input())
test=[]
def stack(how):
    if how[0]=='push':
        test.append(how[1])
    elif how[0]=='pop':
        if len(test)==0:
            print(-1)
        else:
            print(test.pop())
    elif how[0]=='size':
        print(len(test))
    elif how[0]=='empty':
        if len(test)==0:
            print(1)
        else:
            print(0)
    elif how[0]=='top':
        if len(test)==0:
            print(-1)
        else:
            print(test[len(test)-1])
for i in range(n):
    how=input().split()
    stack(how)

이 문제는 단순히 메인에서만 코드를 입력해도 되는 문제이다.

처음 풀었을 때는 리스트의 크기를 선언해놓고 풀었는데 이번에는 이를 제외하고 함수로 매번 호출해서 진입하는 형식으로 풀어보았다. 

 

먼저 메인인 부분을 설명하자면 숫자를 입력받는다.

그리고 이를 여기 코드에서 제일 아래 for문으로 반복문을 돌린다. 

input().split()으로 한 이유는 입력을 받아 나누어서 리스트로 저장하기 위해 진행하였다. 이후 함수 호출하면서 입력받는 내용을 전달한다.

 

여기부터는 문제에서 요구하는대로 그대로 진행하면된다.

입력받은 명령어를 " "을 통해 문자열이 같은지 판단하여 진입하도록 하였다.

먼저 push 부분에서는 입력받은 내용 중  뒤에 부분에 있던 숫자를 추가하는 방식으로 진행했다.

pop 부분은 파이썬에서 .pop이라는 뽑아주는 문법이 있어 이를 활용하였다.  하지만 여기서 길이가 0이라면 진행이 불가하므로 len 명령어로 길이를 판단해주어 if문으로 구분하였다.

size부분은 역시나 python의 명령어 len으로 길이를 재 출력해주었고 empty 역시 길이를 재 구분해서 지정된 결과를 나오도록 하였다.

top은 제일 뒷부분을 출력해주어야 해서 총 길이에서 -1을 해 출력해주었다. 리스트도 0으로 시작하기 때문에 길이보다 리스트의 인덱스가 하나 작기 때문이다. 

이런 방식으로 매번 출력하도록 하면 스택이 완성된다.

 

728x90

'Python > Baekjoon' 카테고리의 다른 글

[Python] 백준 10815 숫자카드  (0) 2022.09.06
[Python] 백준 13305 주유소  (0) 2022.09.03
[Python] 백준 1920 수찾기  (0) 2022.07.07
[Python] 백준 2630 색종이 만들기  (0) 2022.07.04
[Python] 백준 1021 회전하는 큐  (0) 2022.05.28
728x90

이번에 GDSC에서 프로젝트를 하고 있다.

사실 제대로 진행되고 있진 않지만 하나라도 하기 위해 도전하고 있다.

첫번째 도전기는 회원가입 AND 로그인 구현하기

 

찾아본 결과 백엔드 구축을 하는데에는 spring이 좋다고 하였다.

 

그래서 구축 시작

 

여러가지를 도전했다.

eclipse 안에서 설치를 해보기도 하고 따로 깔아보기도 하고 한 결과 성공한 것은 따로 깔기

 

이것도 쉽진 않았다. 

https://semtax.tistory.com/29?category=804335 

 

스프링부트로 게시판 만들기 2 : 스프링 부트 와 JPA 연

개요 이번 포스팅에서는, 스프링부트의 ORM(Object Relation Mapping) 라이브러리인 Spring-data-jpa를 이용하여 실제 데이터베이스에 값을 넣고 빼고, 수정하고, 읽어오는법(CRUD)을 익혀보도록 하겠다. 테이

semtax.tistory.com

참고자료는 여기! 정말 설명은 잘 되어 있는 것 같다.

일단 기본적으로 hello world 출력하기는 성공했으나 뭐가 문젠지 에러가 걸려버렸다.

아무리 찾아도 해결방법은 없음.

 

자바를 배워본 적 있긴하지만 다 잊어버린 나는 결국 포기

정말 많은 자료가 있었으나 html+spring boot이고 나는 flutter  + spring boot를 원했다.

어렵기도 해서 일단은 보류

포기하기 까지 일주일이 넘게 걸렸다.

 

다음 구축 도전은 python이다.

python언어는 백엔드 전용 언어가 아니긴 한데 그나마 편한 언어이기에 도전해보려고 한다.

python으로 db구축해보고 db검색기능 등을 갖추어 보아야 겠다.

 

 

728x90
728x90

알고리즘 중에 접할 수 있는 개념 중 연결리스트가 있다.

연결리스트라는 말이 낯설 수도 있고 해봤을 수도 있다.

 

구조체와 포인터라는 이름으로 배우기도 했는데 연결리스트라는 개념을 확실히 알아보고자 한다.

먼저 연결리스트는 데이터가 담긴 노드(메모리 공간)를 일렬로 해놓은 것을 의미한다.

그리고 이 노드들은 포인터를 통해 연결되어 있다.

그래서 리스트의 중간지점에 노드를 손쉽게 추가하거나 삭제가 가능하다.

이 특징 때문에 크기가 고정되어있지 않으며 확장, 축소를 위해 메모리 할당을 통해 진행한다.

 

하지만 기존 배열과 달리 특정 노드를 찾기 위해 모두 검색해야 한다.

그렇기 때문에 만약에 끝에 있는 노드를 찾고 싶다면 처음부터 끝까지 검색해야 할 것이다.

앞에서 언급했듯이 크기가 고정되어 있지 않기 때문에 노드에 메모리를 할당해주어야 한다.

next 멤버에 다음 노드의 메모리 주소를 저장하고 data 멤버에는 데이터가 저장된다.

만약 마지막 노드라면 next는 아무것도 가르키지 않으므로 NULL을 저장해주어야 한다.

 

메모리 할당 방식은 'struct 구조체 이름 *할당할 이름=malloc(sizeof(struct 구조체이름));' 이다.

그리고 next나 데이터에 저장할 내용은 '할당할 이름->next or data=담을 정보'를 이용해 담을 수 있다.

 

그러면 이제 대략적인 연결리스트 개념을 알아봤으니 노드의 추가, 삭제 방식을 알아보고자 한다.

앞에서 언급한 것도 있지만 그래도 노드 추가에 대해서 한번 더 알아보자

일단은 새로운 노드를 생성해주는 것은 앞에처럼 할당해주는 방식을 사용한다. 

크기는 물론 구조체 크기 만큼 할당해주어야 한다.

그리고 새로운 노드의 next에는 기존에 그 곳을 가르키는 앞의 next가 가르키도록 해주어야 하고

새로운 노드의 data에는 data를 담아야 할 것이다.

 

그러면 기존 앞에 있던 노드의 next는 새로운 노드를 가르켜야 한다.

이렇게 해주면 새로운 노드를 추가할 수 있다.

이제 노드를 삭제하는 방식을 알아보자

삭제하고자 하는 노드는 기존 target에서 next로 가르키고 있던 데이터이다.

그리고 target의 next는 삭제하고자 하는 노드의 next를 가르키도록 해야 사이에 있는 삭제하고자 하는 노드가 빌 수 있다.

그리고 최종적으로 free를 통해 메모리 할당을 해제해주면 된다.

이 과정을 통해 연결리스트를 구현할 수 있다.

728x90

+ Recent posts