그래오늘은이거야

[Java]goorm test(구름TEST) 스택(Stack) 본문

세상 개발/Java(SpringFramework)

[Java]goorm test(구름TEST) 스택(Stack)

jinhongstar 2019. 8. 30. 14:41
728x90
반응형

안녕하세요 Leo 입니다.

 

이번 소개해줄 알고리즘 사이트는 구름TEST 라는 사이트 인데요,

 

NHN에서 투자 받아 개발한 알고리즘 사이트 입니다.

 

회사면접 코딩테스트를 하는 유명한 사이트죠...

 

저는 IOS (Object-c , Swift) 위주로 개발을 하고 가끔 안드로이드 개발을 하는데요...

 

 

회사에서 Java 로 코딩테스트를 하라고 해서 ... 하라면 해야죠... 풀어봤습니다.

 

제가 20문제 이상 푼것 같은데 이걸 공유 해드리도록 하죠...

 

 

이 글이 누군가에겐 "약"이 되고 누군가에겐 "독"이 될 것이다.

개발자라면 적어도 기본 알고리즘 정도는 스스로 학습하여 풀어봐야 한다.참고로 코딩테스트 문제를 제출 한 심사위원 분도제 블로그에서 답을 확인 한다는 것을 역으로 알아두고 보세요!! ㅎㅎ

 

 

 

알고리즘 문제

 

문제 : 스택(stack)은 제한적으로 접근할 수 있는 나열 구조입니다. 스택은 한 쪽 끝(Top이라고 합니다)에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)으로 되어 있습니다. 자료를 넣는 것을 '밀어넣는다' 하여 푸시(push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 팝(pop)이라고 하는데, 이때 꺼내지는 자료는 가장 최근에 보관한 자료부터 나오게 됩니. 이처럼 나중에 넣은 값이 먼저 나오는 것을 LIFO 구조라고 합니다. 



문제는 푸시(push)와 팝(pop)으로 스택에 자료를 넣고 빼는 작업을 진행하고 스택의 마지막 상태를 출력하는 프로그램을 작성하십시오.

*스택은 최대 10개의 자료가 들어갈 수 있고, 10개를 넘으면 overflow를 출력합니다.

*스택이 비어있는 상태에서 pop을 실행하면 underflow를 출력합니다.

*프로그래밍 언어에서 제공하는 라이브러리를 사용하지 않고 문제를 해결하는 것을 권장합니다.



입력

첫 줄에 데이터 입력 횟수가 입력됩니다.

다음 줄부터 0인 경우 푸시이고, 1인 경우 팝이 일어납니다(stack overflow/underflow 고려할 것).

0 또는 1 이외의 것을 입력하면 프로그램을 종료합니다.

푸시인 경우에만 자료의 내용을 다음 줄에 입력합니다.

출력

데이터 입력이 모두 끝난 후 스택의 상태 ( 방향: Bottom ------> Top )

 

입/출력 예시
⋇ 입출력 형식을 잘 지켜주세요.
␣ : 공백
↵ : 줄바꿈
−⇥ : 탭
보기 입력 1
3
0
10
0
20
0
30 
출력 1
10 20 30 

보기 입력 2
3
0
10
0
20
1
출력 2
10 

 

======================================================================================================

풀이

======================================================================================================

 

//Please don't change class name 'Main'

import java.util.Scanner;
import java.util.Arrays;

class Main {
/**
첫 줄은 무조건 데이터 입력 횟수!!

두번째 줄 부터 push&pop
세번째 줄 부터 값

이렇게 총 10개의 데이터를 입력 할 수 있다.
그러면 count 받는 개수만큼 sdtin을 받아야한다.

0 : push 
1 : pop

두번째 줄에 0,1 이 아닌 다른 값이 나오면 그냥 프로그램 종료 return;

*/

  public static void main(String[] args) {

		
		String firstCount;
		Scanner scan = new Scanner(System.in);
		firstCount = scan.nextLine();
		int count = Integer.parseInt(firstCount);
		
		int maxData = 10; //최대값.
		
		String[] stdInArr = new String[count];
		
		if(count == 0) return; //첫줄이 0 이면 더이상 입력 할 값이 없음 또는 최대 10개.
		
		Boolean isStatus = false;
		
		int inputCount= 0; //입력한 모든 값
		Boolean isPop = false; //마지막 공백이 들어가서 자꾸 불일치남... 
		String temp = "";
		
		int ppCount = 0; //push&pop count 값
		
		while(!isStatus){
			
			String inputData = scan.nextLine();
			// System.out.println("결과값 : " + Arrays.toString(stdInArr));
		
			//입출력횟수 10개가 아닌 queue를 진행 하면서 입출력 중 10번째 입력값이면 overflow !!
			if(inputCount > 10){
					System.out.print("overflow");
				 	break;
			}
			
			if(inputCount % 2 == 0){ // push & pop 입력값
				
				temp = inputData;
				if(inputData.equals("1")){
					isPop = true;
					//무조건 첫번째면 underflow
					if(ppCount == 0){
						System.out.println("underflow");
						
					}else{
						ppCount--;
						
						//첫번째가 아닌데 이전 값이 null이면 스택이 비어있는 상태
						//stdInArr[ppCount] null이면 스택이 비어있는 상태에서 pop을 실행하면 underflow를 출력합니다.
						if(stdInArr[ppCount] == null){
						//그냥 기본적인 첫번째 배열에서 pop을 하면 underflow가오고
						System.out.println("underflow");
						}else{	
							stdInArr[ppCount] = null;
						}
					}
					
					break; //푸시인 경우에만 자료의 내용을 다음 줄에 입력합니다.
				}
				
			}else{
				//push & pop 을 실행.
				if(temp.equals("0")){ // push
					
					stdInArr[ppCount] = inputData;
					ppCount++;
				}else if(temp.equals("1")){ // pop

					
					
				}else{
					return; //0/1 이아닌 다른값이면 시스템 종료	
				}
				
				temp = ""; //초기화
				
			}
			
			inputCount++;
			
			if(inputCount == count * 2){
				isStatus = true;
			}
			
		}
		
		
		
			String str = "";
		if(isPop == false){
			str = Arrays.toString(stdInArr).replace(", "," ").replace("[","").replace("]","");
		}else{
			str = Arrays.toString(stdInArr).replace(", "," ").replace("[","").replace("]"," ").replace("null ","");
		}
		

		System.out.print(str);
		
  }
	
}




 

 

참고로 저는 알고리즘 풀이 점수는 높은 점수는 아닙니다. 

 

일단 푸는 거에 집중했습니다.  알고리즘에 정답은 없습니다.

 

더 좋은 알고리즘을 만들어 내는게 목표 입니다.

 

 

알고리즘에 대하여 더 이야기 하실분은 댓글남겨주세요!

 

 

 

 

 

 

 

구름TEST 화면

 

 

 

 

https://codingtest.goorm.io/

 

구름TEST - 개발자 채용을 위한 코딩 테스트, 프로그래밍 시험

구름TEST는 LG전자, 라인, NHN, 스마일게이트 등에서 활용 중인 온라인 코딩 테스트 서비스입니다. 부서별, 직군별 시험 관리부터 문제 제작, 관리 기능과 응시자 초대 기능 등 개발자 채용을 위한 모든 기능을 제공합니다.

codingtest.goorm.io

 

구름테스트, 구름TEST 가 지원하는 프로그래밍 언어

 

그 외 Scala, Pascal, Lua, Objective-C, Rust, Cobol, Clojure, Smalltalk, Dart, Haskell, Perl, Common Lisp, D, Erlang 등 

 

 

 

구름테스트, 구름TEST 를 2019년 현재 적용중인 회사

 

 

 

반응형
Comments