일단 씻고 나가자

25556번 : 포스택 본문

Algorithm/백준을 자바라

25556번 : 포스택

일단 씻고 나가자 2023. 3. 14. 00:48

너무 오랜만에 백준을 썼더니 클래스명에서 컴파일 에러를 내버렸다.. BJ_25556_FourStack 은 왜 클래스명에 맞지 않는 걸까? 간지나는 클래스명 짓기야말로 내 코딩 인생 우선 순위에서 pop() 할 관심사인데..
 

 
기본적인 스택의 개념을 묻는 문제인 것 같다. 자바는 또 Stack이라는 클래스를 가지고 있어서 활용하기 알맞게 떠먹여 주고 있다.
 
우선 뭔 소린가 문제를 한참 봤다. 스택이니까 스택 개념은 관련이 있을 텐데.. 한참 보고 예제를 손수 해보니까 뭔 소린지 그제야 이해가 가더라. 문제를 다 이해하고 보니, 굳이 이게 스택 관련..? 수학적인 이해만 있으면 되는 거 아닌가..? 그래서 굳이 스택 클래스를 쓰진 않았다. 
 

우선 킹모장에 첫 번째 예제를 써보고 순서대로 적어보았다. 오름차순 정렬이고 가장 처음에 꺼낸 수가 맨 뒤.. 그니까 그냥 큰 수가 먼저 나오면 예쁘게 1 2 3 4 하고 정렬된다는 말이고, 이말인즉 우리는 정렬 후 pop할 때 내림차순 순서로 큰 수가 먼저 나올 수 있도록 알고리즘을 짜야 한다는 설명이다. 고로 가장 큰 수는 스택의 가장 윗단에 존재해서 가장 먼저 나와야 하고, 작은 숫자는 아래에 깔려야 마지막에 나올 수 있겠다.
 

이 말은, 특정 스택의 맨 위에 이미 존재하는 숫자보다 작은 숫자가 추후에 들어오게 되면 그 숫자는 영원히 나올 수 없다는 뜻이다.
윗 예시에서 1이 5를 막고 있으면 (= 1이 5보다 후에 들어온다면) pop 시엔 당연하게도 1이 먼저 나오고 후에 5가 나오게 될 텐데, 그 말은 큰 수가 작은 수보다 늦게 나온다는 뜻으로 오름차순 정렬이 불가능하다는 소리다. 그럼 애초에 4개의 스택에 각각 숫자를 넣을 때, 각 스택에 지금 input되는 숫자보다 작은 숫자가 있는 곳으로 집어 넣는 것이 가능하다면 조건이 성립하는 것 아닐까? 위의 예시처럼, 5 4 3 2 가 들어간 상태에서 1이 들어갈 차례에 1보다 작은 숫자가 있는 스택이 없을 때는 불가능한 경우라는 소리다.
 

굳이 Stack 클래스를 쓸 필요도, Stack을 구현할 필요도 없다.

클린코드의 길은 멀고도 험하다. 멋드러지게 Stream으로 한 줄 클리어를 하고 싶었지만.. 점점 정진하자. 아무튼 내가 메모장에 예시를 적은 순서 그대로, 이중 for문을 돌면서 현재 들어갈 input 데이터보다 작은 숫자가 있는 배열을 찾고, 찾았다면 그 배열에 현재 데이터를 최신화. 4개를 다 돌았는데도 작은 숫자가 없다면 "NO"라고 소리치고 for문을 빠져나오는 코드를 짰다. 코드를 break하는 방법이 생각이 안나서 String answer와 boolean isFour(작명에 처참히 실패. 이 변수는 작은 숫자를 찾았냐 못찾았냐로 true false를 알려주는 변수이다.) 두 변수나 써버렸는데, 생각해보니 boolean 하나만 두고 마지막에 삼항 연산자로 Yes/No를 처리할 걸 그랬다.. 다음엔 잊지 말자!

'Algorithm > 백준을 자바라' 카테고리의 다른 글

24174번 : 알고리즘 수업 - 힙 정렬 2  (0) 2023.03.22
1158번 : 요세푸스 문제  (1) 2023.03.17
26008번 : 해시 해킹  (0) 2023.03.16
10818번 : 최소, 최대  (2) 2023.03.15
1021번 : 회전하는 큐  (2) 2023.03.14