Stack 7

[JAVA]BOJ 17298, 오큰수

스택을 이렇게도 쓸 수 있구나 하고 깨달은 문제이다. 문제 자체는 간단해보이는데 시간제한내에 풀려면 스택을 꼭 써야한다. 그리고 출력시에도 주의가 필요하다. 풀기위해 필요한 필드는 입력받는 배열1, 결과값 저장하는 배열2, 빈 스택, 해서 총 3가지가 필요하다.1. 배열1에 입력을 받는다.2. 배열1의 마지막 값부터 스택값과 비교한다.3-1. 스택이 비어있으면 -1을 배열2에 추가한다.3-2. 스택 맨 위 값이 더 크면 오큰수이므로 peek()값을 배열2에 추가한다.3-3. 스택 맨 위 값이 작거나 같으면, 스택 3-1, 3-2의 조건이 될때까지 pop()을 한다. 이렇게 설명하면 어려우니까 한 단계씩 풀어보자. 입력값 : 3 5 2 7 , 굵은 글씨가 스택이다.-                      ..

코딩가딩가 2024.09.01

[JAVA]BOJ 1874, 스택 수열

출력값을 어떻게 저장해야되나.. 고민하다가 두 번이나 틀렸다. 처음은 BufferWriter 썼고 출력초과 받았다. 지피티한테 물어봐서 어떻게 원인 알고 해결하려는데 좀 어려운것 같아서, 좀 더 쉬운 String에 추가하는 형식으로 출력값을 만들었다. 그랬더니 메모리초과가 나더라. 알고보니 String에 직접 추가하는 방식은 새로운 String을 계속 만드는거라 메모리를 마니잡아먹는댄다 !! 새로운걸 알았다..StringBuilder를 써서 출력값을 만드니 정답으로 인정됐다!난 자바에 대해 너무 모른다고 느낀다.. 천천히 조금씩 배워야겠다고 생각하지만 마음이 급해진다. 아무튼 ..  푸는 방법은 수열이 주어지고 글자 하나를 tmp라고 하자. 그리고 정상적인 수열인지 아닌지를 판별하는 flag=1 변수를 ..

코딩가딩가 2024.08.31

[JAVA]BOJ 16120, PPAP

문제에서 요구하는게 무엇인지, 문제를 잘 읽어야 한다. PPAP문자열이란 P에서 시작해 문자내의 P를 "PPAP"로 바꾼 문자열을 말한다. "P"는 PPAP문자열이고, "PPAP"는 PPAP문자열이다. "PPAPPAP"도 PPAP 문자열이다. "PPAPPAPPAP"도 PPAP문자열이다.PPAP문자열이 아닌것은 PAPPP, PPAPP, PP 등이 있다. P에서 시작해 P가 PPAP로 치환되는 모든 경우의 수가 PPAP문자열이다. 단순히 PPAP만 있다고 PPAP문자열이 아니다. P, PPAP, (PPAP)PAP, P(PPAP)AP, PPA(PPAP), ((PPAP)PAP)PAP ... 등이 PPAP문자열이다. 입력받은 String이 PPAP문자열인지 확인하기위해 스택을 사용했다. 1. String을 한 글..

코딩가딩가 2024.08.31

[JAVA]BOJ 5397, 키로거

결과 출력시 줄바꿈이 필요하다. BufferWriter써서 줄바꿈 안 넣었는데 틀렸었다.. 스택을 활용한 문제이다. 커서를 기준으로 왼쪽 스택, 오른쪽 스택을 나눈다. 그리고 화살표로 커서가 이동할때 이동한 만큼 스택의 값을 이동시킨다.아래는 예시이다AB|C  -> leftStack: AB / rightStack: C -> 'A|BC -> leftStack: A / rightStack: CB -> 커서가 이동하면서 B가 왼쪽스택에서 오른쪽 스택으로 옮겨갔다. 스택은 한쪽에서만 In&Out이 일어난다. 임의로 뒤에서 넣고 뺀다고 가정했다. 그리고 출력시에는 왼쪽스택은 스택의 역순으로, 오른쪽스택은 스택그대로(pop)출력하면 된다. 주의사항은 스택이 비었을때는 값을 이동하지 못한다는 점이다. 예외처리는 간단..

코딩가딩가 2024.08.29

[JAVA]BOJ 2504, 괄호의 값

생각하는게 너무 어려웠다. 스택을 사용한다. 1. (, [ 인 경우, stack에 넣고 tmp=*2, tmp=* 3 하기 2. ), ] 인 경우, 2-1.()[]인 경우 res+=tmp, 2-2.아닌경우 tmp/=2,3 하기 (()(())) 이걸로 예를 들면.. 우선 숫자로 식을 표현해보자우리가 일반적으로 보는 숫자 식으로 바꾸면 2*(2+2*(2)) 이 된다.  그리고 분배법칙에 따르면 이 식은 2*2 + 2*2*(2)과 같다. 위에서 설명한 1. 2.방식은 숫자식을 후자( 2*2 + 2*2*(2) )와 같은 방식으로 계산한 것이다. 한 단계씩 글로 표현하면 아래와 같다.코드는 위의 알고리즘대로 짜면 된다. 그리고 괄호가 맞지않을때 에러표시로 0을 출력해야한다. 즉 예외처리가 필요하다. 괄호가 맞지않는..

코딩가딩가 2024.08.29

[JAVA]BOJ 10799, 쇠막대기

처음엔.. 어떻게해야하지? 고민했는데.. 1.파이프일때는 스택에 넣고 2.레이저일때는 스택에 넣지 않는다. 그리고 3.파이프를 스택에 넣을때 파이프의 개수를 증가시킨다. 4.레이저를 만났을때 파이프의 개수를 스택에 비례해 증가시킨다. 규칙은 이렇다.위에 코드 짤 알고리즘을 타이핑으로 쳐봤다. ((( -> 이게 스택이다. 마지막줄에 - 는 스택이 비었음을 의미한다.더하기 부분에서 0 + 3 = 3 이거는 cnt가 0인데 스택에 ((( 아래는 전체 코드이다.import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Stack;public class BOJ10799 { pu..

코딩가딩가 2024.08.25

[JAVA]BOJ 4949, 균형잡힌 세상

스택을 활용한 문제이다. 예외처리가 있어 좀 까다롭게 느낄 수 있다. 나는 전에 c언어로 스택 구현하면서 비슷한 문제를 풀어봤어서 쉽게 성공했다. import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Stack;public class BOJ4949 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Stack stack = new Stack(); ..

코딩가딩가 2024.08.25