간단한 스택구현하는건데 비쥬얼에서 실행했을때는 잘돌아가던데 백준에 제출하니까 런타임 에러뜨네요
이렇게 간단한 것도 못짜고 자괴감 드네요 ㅠㅠ
문제 : https://www.acmicpc.net/problem/10828
어디가 문제인걸까요....
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | using System; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { int k = Convert.ToInt16(Console.ReadLine()); Stack S = new Stack(k); for (int i = 0; i < k; i++) { String str= Console.ReadLine(); switch (str) { case "pop": Console.WriteLine( S.pop()); break; case "top": Console.WriteLine(S.top()); break; case "size": Console.WriteLine(S.sizeOf()); break; case "empty": Console.WriteLine(S.empty()); break; default: String[] temp = str.Split(' '); S.push(Convert.ToInt16(temp[1])); break; } } } } public class Stack { public int[] data; int size = -1; public Stack(int maxdata) { data = new int[maxdata]; } public void push(int input) { data[++size] = input; } public int pop() { return (size == -1) ? (-1) : (data[size--]); } public int top() { return (size == -1) ? (-1) : (data[size]); } public int empty() { return (size == -1) ? (1) : (0); } public int sizeOf() { return size+1; } } } | cs |
얼핏보기에 default 가 push 인 것이 문제.
if (str.Length > 5) { str = str.Split(' ')[0]; }
이렇게 해서 push 나올때 처리하게 하고 default를 없에고 case "push"를 썻는데 안되네요 ㅠㅠ
일단 에러와 상관없이 아래 쓰인 ToInt16 은 문제의 범위에 못미치는 것이라 문제됨. ( 100000 표현 안됨 )
default 에 이렇게 해 보면 될듯.
if( str.IndexOf("push") >= 0 ) { String[] temp = str.Split(' '); if( temp.Length > 1 ) S.push(Convert.ToInt32(temp[1])); };
런타임 에러라는게 힌트인데, 그건 니가 잘못된 주소에 접근했을 가능성이 크다는거임. 잘못된 주소에 접근하는 방법은 배열의 크기를 넘는게 대표적이지. 백준 문제는 입력 예제에 생각지 못한 whitespace 같은게 섞여 있는 경우도 있으니 적당히 걸러 줘야함.
덕분에 시원하게 해결되었습니다!! 충성충성!