문제: 정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯가지이다.
-push X : 정수 X를 스택에 넣는 연산
-pop : 스택에서 가장 위에 있는 정수를 빼고 그 수를 출력한다. 만약 스택에 들어있는 정수가 없을 경우에는 -1을 출력한다.
-size : 스택에 들어있는 정수의 개수를 출력한다.
-empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
-top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
(출처: https://www.acmicpc.net/problem/10828)
다른건 다 모르겠는데 push부분에서 짜증이 난다. 이클립스에서는 잘 실행되는데 제출만 하면 런타임오류가 난다. 도대체 어디에서 문제일까. 왜 매번 이럴까-.,- 아마도 push문제인거같다 아무리 생각해 보아도!!!
우선 Stack을 구현한다.
그 다음 포문을 돌려 명령을 받고 그 명령에 따른 결과값을 출력해준다. 다른 명령문들이야 그냥 맞음 맞고 아님 아닌거 같은데 push의 경우 문자와 정수를 동시에 받아야 해서 아마 그 입력이 제대로 안 들어가는게 아닐까 생각된다.
그래서 처음으로 생각한 방법은 index를 이용한 방법이었다.
주석으로 돼 있는 이유는 나중에 다른 방법을 써먹으려고 하다보니.. 주석처리가 되었습니다.
받은 명령인 String의 0부터 3까지의 글자가 push면 push()를 실행하는 식으로 짰다. 근데 이상한게 내가 생각하는 인덱스와 이클립스가 생각하는 인덱스가 다른거 같아서... 아니, push면 0123으로 해서 0부터 3까지 아닙니까. 근데 0부터 3으로 하면 인식을 못하고 왜때문에 0부터 4로 해야 push를 인식하는 건가여....? 이클립스가 멍청이인건가여
근데 요 방법은 들어오는 숫자가 두 자리 숫자일 때 런타임이 나게 돼 버렸당! 바보! 바보멍청이! 들어오는 숫자가 한 자리라는 법이 없는데 생각을 못 했지 말입니다. 알려주셔서 감사합니당!! 하앜
그래서 다시 생각한 방법은 split이었다. push를 제외하고는 다른 명령어는 다 한 단어이기 때문에 push를 명령할 경우만 생각해도 됐다.
공백(" ")을 기준으로 잘라서 그 배열의 2번째인 숫자를 넣는 식으로 구현했다. 자른 단어는 string의 일부이므로 파싱을 해서 int로 바꿨다. 그리고 나서 stack에 push를 해줬다. 그렇게 하면 이클립스에서
잘 나오는데 어째서 왜때문에 짜꾸 런타임오류 나는거져.... 스트레스 받네여ㅠ_ㅠ
숫자 입력에 대한 예외처리를 안 해서 일까여
아니면 push에서 이상하게 입력을 했을 때에 대한 예외처리를 안 해서일까여
아니면 그냥 아무거나 쳤을 때에 대한 예외처리를 안해서?
아니면 숫자에 문자쳤을 때 어찌할지 안해줘서?
으앙 뭐져 뭐야 뭐냐 뭘까 뭥가여 으카으카으캉앙캬으카이카앙커ㅣ;아ㅓ키;아ㅓㄴㅇ;리ㅏ먼애럼ㄷㅈㄹ
-------------------추가
scanner를 하나로 줄이고 scan.nextInt()랑 scan.nextLine()으로 바꿨다.
그렇게 되면 포문이 한 번 줄어드는데(int 입력을 한 번 한걸로 쳐버린다) 그 때문에 포문도 for(int i=0; i<N ; i++)에서 for(int i=0 ; i<=N ; i++)로 바꿔줘야 했다. 그랬더니 맞았다.
아오
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
scanner를 하나로 해서 scan.nextInt(), scan.nextLine()로 했더니 인트를 입력한건데도 command 조건문으로 들어가길래 그냥 아예 따로 선언해준건데.. 뭐 모르겠다. 포문도 제대로 안 돌아가는게 맞는건가여?? 쫘증 만땅
보통은 scanner 두번 선언해도 문제 없다고 합니다...
그냥 문제가 이상했던걸로 그냥 할래...
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
거지같은 문제였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | import java.util.*; public class Stack1 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); Scanner scan2 = new Scanner(System.in); Stack<Integer> stack = new Stack<Integer>(); System.out.println("명령할 수를 입력해주세요"); int N = scan.nextInt(); //명령할 수 입력받기 String command; System.out.println(N + "번의 명령을 해주세요"); for(int i=0 ; i<N ; i++) { command = scan2.nextLine(); if(command.equals("pop")) { if(stack.empty()) { System.out.println("-1"); } else { System.out.println(stack.pop()); } } else if(command.equals("size")) { System.out.println(stack.size()); } else if(command.equals("empty")) { if(stack.empty()) { System.out.println("1"); } else { System.out.println("0"); } } else if(command.equals("top")) { if(stack.empty()) { System.out.println("-1"); } else { System.out.println(stack.peek()); } } /*else if(command.substring(0, 4).equals("push")) { int a = command.charAt(5)-'0'; stack.push(a); System.out.println(a + "가 들어갔습니다."); } */ else if (command.split(" ").length == 2) { String vocas [] = command.split(" "); int b = Integer.parseInt(vocas[1]); System.out.println(vocas[0] + " : " + vocas[1]); stack.push(b); } } scan.close(); scan2.close(); } } | cs |
'건승하고있어요 > 알고리즘' 카테고리의 다른 글
[queue] 큐 기본문제와 상속 (8) | 2018.02.06 |
---|---|
[for] 열 개씩 끊어 출력하기 (9) | 2018.02.05 |
[문자열사용] 아스키코드 (0) | 2018.02.01 |
[이항계수] 팩토리얼 (0) | 2018.02.01 |
[1차원배열] 단어의 개수 찾기 (0) | 2018.01.31 |