그래오늘은이거야

[Java]goorm test(구름TEST) 알고리즘 algorithm 큐(Queue) 본문

세상 개발/Java(SpringFramework)

[Java]goorm test(구름TEST) 알고리즘 algorithm 큐(Queue)

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

안녕하세요 Leo 입니다.

 

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

 

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

 

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

 

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

 

 

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

 

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

 

 

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

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

 

 

 

알고리즘 문제

 

문제 : 큐는 먼저 집어 넣은 데이터가 먼저 나오는 FIFO (First In First Out)구조로 저장하는 형식을 말합니다. 

나중에 집어 넣은 데이터가 먼저 나오는 스택과는 반대되는 개념입니다.

EnQueue(입력), DeQueue(출력) 를 통해 자료 입출력이 구현됩니다. 

큐가 꽉 차서 더 이상 자료를 넣을 수 없는 경우를 Overflow, 큐가 비어 있어 자료를 꺼낼 수 없는 경우를 Underflow라고 합니다.

이번 문제를 큐의 기본 동작과 관련된 문제입니다. 아래의 입력/출력 조건에 맞게 프로그램을 작성하세요.




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

*큐가 비어있는 상태에서 Dequeue을 실행하면 underflow를 출력합니다.

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



입력

첫 줄에 입출력의 횟수를 입력합니다.

다음 줄부터 입력 또는 출력 여부(d 또는 D)를 입력하고 입력(e 또는 E)일 경우는 자료 내용까지 입력합니다.

* e(E) 또는 d(D) 이외의 입력이 들어올 경우 큐의 최종 상태를 출력하며 프로그램이 종료됩니다.

출력

입출력 횟수가 끝나거나 프로그램이 중간에 종료되면 큐의 최종 상태를 출력합니다.


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

보기 입력 2
4
d
e
10
e
20
e
30
출력 2
underflow
10 20 30

 

 

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

풀이

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

 

//Please don't change class name 'Main'
import java.util.Scanner;
import java.util.Arrays;
class Main {
/**
	문제 그대로 스택과 반대 되는 개념.
	FIFO 
	
	첫줄은 입출력 횟수...
	
	두번째 줄 부터 d,e (대소문자 상관없다는거 보니) 난 무조건 소문자로 돌려서 개발.
	세번째 줄 부터 값

	조건중에 d,e 가아닌 다른 값이 오면 프로그램 종료

	**** 스택과 비슷해서 가져와서 수정

	이 문제는 스택과 다르게 d 를 입력하면 삭제를 시키고 다음 값을 입력 못함

*/
	
  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; //d&e 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){ // 입력,출력 
				
				temp = inputData;

				if(inputData.equalsIgnoreCase("d")){
					
					// System.out.println(Arrays.toString(stdInArr));
					
					isPop = true;
					//무조건 첫번째면 underflow
					if(ppCount == 0){
						System.out.println("underflow");
						 //underflow가 계속 나오게 만들어야함 시스템 종료가 아닌 진행
					}else{
						
						
						//첫번째가 아닌데 이전 값이 null이면 스택이 비어있는 상태
						//stdInArr[ppCount] null이면 스택이 비어있는 상태에서 pop을 실행하면 underflow를 출력합니다.
						
							stdInArr[0] = null;
							
							//나중에 0번째 배열을 삭제 후 
							//다시 << 왼쪽으로 밀어 버리고 
							//0번째값이 다른 값으로 대치 되야한다.
					
					}
					inputCount++;
					// break; //푸시인 경우에만 자료의 내용을 다음 줄에 입력합니다.
				}
				
			}else{
				//EnQueue(입력), DeQueue(출력) 를 을 실행.
				if(temp.equalsIgnoreCase("e")){ // EnQueue(입력)
					
					stdInArr[ppCount] = inputData;
					ppCount++;
				}else if(temp.equalsIgnoreCase("d")){ // DeQueue(출력)

					// inputCount++;
					
				}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