[Java]goorm test(구름TEST) 알고리즘 algorithm 큐(Queue)
안녕하세요 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 화면
구름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년 현재 적용중인 회사