티스토리 뷰

반응형

 


백준 10828 스택(stack) 문제 설명

오늘은 백준의 10828, 스택 문제를 풀어보겠습니다.

이번에 풀게 될 문제는 LIFO(Last In First Out) 방식으로 작동하는 스택(stack)의 기본적인 기능들을 실제 구현하고, 연산 결과를 출력하는 문제입니다. swift언어를 통해 문제를 푸려면 스택을 직접 구현해서 push, pop등의 연산을 수행해야할까요? 

 

고민해보시면 좋을 것 같습니다. 

 

 

 

 

시간제한은 0.5초, 명령의 수는 최대 10,000회입니다. O(N)의 시간 복잡도로 무난하게 문제를 풀어보겠습니다. 각 명령마다 상수시간 복잡도로 연산을 수행시킬 예정입니다. 

 

스택의 구현해야할 동작은 위의 목록과 같습니다. 
- push / pop / size / empty / top 입니다. 그대로 구현해보도록 하겠습니다. 

 

 

 

 

먼저, 명령의 갯수, N을 입력 받고, 이후에 명령을 위와 같은 방식으로 수행하고 출력해주면 됩니다. 각 명령마다 숫자가 있을수도 없을수도 있으니 잘 분기처리를 해서 입력값을 처리해줘야 겠습니다. 

 

바로 swift언어를 활용해서 해당 문제를 풀어보도록 하겠습니다.

 

 

 


백준 10828 스택 swift언어 활용 문제풀이

먼저 스택(stack)으로 사용할 배열 하나를 선언했습니다. 그렇습니다. swift언어의 배열은 c++언어의 벡터와 같이 동적으로 크기가 변환될 수 있는 배열이기때문에 swift 배열의 removeLast(), append()를 pop(), push()와 같은 역할로서 사용할 수 있는 것입니다. 물론 removeLast(), append()의 시간복잡도는 상수시간으로 Stack의 push(), pop() 시간복잡도와 동일합니다.

 

그렇게 STK 스택배열을 선언 했꼬, iValue라는 함수는 숫자값이 들어간 문자열을 숫자로 변환시키는 작업을 합니다. 제가 예전에 작성했던 코드라 그런지 작명이 좀 대충 지어진것 같은데 이해부탁드려요 ㅎㅎ 

 

문자열 값에 만약 "123"이 들어있다고 한다면, 1, 1 * 10 + 2, 12 * 10 + 3 -> 123의 숫자가 나오도록 되는 로직인데요. 아마도 Int("123")! 연산이 시간이 오래걸리다보니, 연산시간을 줄이기 위해 위와 같은 함수를 사용했던 것 같습니다. 

 

swift언어에 대한 입출력, 연산시간 제한을 백준에서 고려해주지 못하는 경우가 은근히 있기 때문에 그렇습니다. ㅠㅠ 

 

 

 

 

stkIp 클로져의 정의입니다. 익명함수, 클로져를 stkIp에 넣는 형태로되어있는데요. 굳이 위와 같이 할 필요없습니다. func stkIp 함수의 형태로 해도 큰 차이는 없습니다. 결국 둘다 함수니까요.

 

입력 받은 [String]타입의 문자열 리스트는 list[0]에 명령문구가, lists[1]에 (만약 숫자가 있다면) 숫자 값을 담고 있습니다. 연산 로직을 차례대로 보겠습니다.

13 ~ 14행) push 명령일 경우, list[1]값을 STK에 append 해줍니다. push 해주는 것이지요.

15 ~ 16행) pop 명령일 경우, STK 배열이 텅텅 비어있다면, -1을 출력하고, 값이 있다면 removeLast()로 pop()과 같은 연산을 수행해줍니다. removeLast()는 제거한 값을 반환하기 때문에 해당 문제가 요구하는 출력값과 일치합니다. 

17 ~ 18행) top() 명령일 경우, STK 배열이 비어있다면 -1을 출력하고, 값이 있다면 STK의 맨 마지막 값, last!를 반환합니다. last! 값이 곧, 스택의 top 값이 되지요.

19 ~ 20행) size 명령일 경우, 그대로 STK 배열의 크기를 만환해줍니다. 배열의 크기를 반환하는 프로퍼티는 count입니다. 랜덤접근방식의 일반 배열에서 count 시간복잡도는 O(1)로 상수시간입니다. 문제없지요.

21 ~ 22행) empty 명령일 경우 STK가 비어있는지에 따라 1, 0을 출력해줍니다. 짧은 라인으로 문제를 푸려다보니 삼항연산자르 많이 활용하게 되었네요. 

 

이렇게 Stack 스택의 핵심 기능들을 swift의 기본 배열로 구현해볼 수 있었습니다. 이제 해당 함수(클로져)를 활용해서 문제를 해결하면 되겠습니다.

 

 

 

 

 

명령 횟수, N 정수를 입력 받구요. N번의 명령을 입력 받을 때마다 해당 문자열을 공백단위로 쪼개서 [String] 배열로 만들어 준뒤, 해당 배열을 stkIp함수의 인자로 활용해서 연산을 수행합니다. 

 

"push 1"의 경우 -> ["push", "1"]의 배열 형태로 stkIp 함수의 인자값으로 사용되는 것이지요. 그렇게 해당 문제를 풀 수 있었습니다. 코드를 제출해보겠습니다. 제출 결과는 아래와 같습니다. 

 

 

 

 

 

 

 

 


이렇게, 백준의 기초 스택(stack) 구현문제르 swift언어를 통해 풀어보았습니다. swift언어의 일반 배열 기능인 removeLast, append, count, isEmpty 등의 멤버 프로퍼티, 메서드를 통해서 스택과 유사한 연산을 수행할 수 있다는게 핵심 내용입니다. 

 

 

 

 

 
반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함