-
백준 10828번, 스택 자바로 구현Problem Solving 2020. 4. 22. 14:58
오늘은 백준의 10828번 문제인 스택을 풀어봤습니다.
자바로 문제를 풀었고 4번의 시도 끝에 성공했습니다.
사소한 부분에서 자주 틀리는데 이번에는 문제에서 주어진 테스트 케이스 하나만 통과했다가
다른 테스트 케이스 하나를 다시 시도해보니 잘못 구현한 부분이 있었습니다.
문제에서 주어진 테스트 케이스는 당연히 성공해야하며, 구현자가 직접 테스트 케이스를 만들어 시도해야 할 필요도 있음을 알았습니다.
또한, 백준에서 자바로 제출할시엔 반드시 메인 클래스 이름을 Main으로 해야합니다. 안그러면 컴파일시에 바로 에러가 나온다고 하네요.
/** * 백준 10828문제입니다. */ import java.util.Scanner; //제출할 시엔 클래스명을 Main으로 해야합니다. public class StackImpl { public static void main(String[] args) { int loopCount = 0; int resMsg; Scanner scanner = new Scanner(System.in); int count = scanner.nextInt(); Stack stack = new Stack(count); scanner.nextLine(); while (loopCount != count) { String message = ""; message = scanner.nextLine(); if (message.contains("push")) { try { String[] splitedMsg = message.split(" "); int number = Integer.parseInt(splitedMsg[1]); stack.push(number); loopCount++; } catch (Exception e) { e.printStackTrace(); throw e; } } else if (message.equals("top")) { resMsg = stack.top(); System.out.println(resMsg); loopCount++; } else if (message.equals("pop")) { resMsg = stack.pop(); System.out.println(resMsg); loopCount++; } else if (message.equals("size")) { resMsg = stack.size(); System.out.println(resMsg); loopCount++; } else if (message.equals("empty")) { int isEmpty = stack.empty(); System.out.println(isEmpty); loopCount++; } } } } class Stack { int[] array; int top = -1; public Stack(int num){ this.array = new int[num]; } public void push(int num) { array[top+1] = num; top++; } public int pop(){ if (top == -1) return -1; int result = array[top]; top--; return result; } public int size(){ return top+1; } public int empty(){ if (top == -1) return 1; else return 0; } public int top(){ if (top == -1) return -1; else return array[top]; } }
개인적으로 Stack을 클래스로 분리해서 접근한 부분이 좋았다고 생각합니다.
아쉬운 점은 저 많은 If와 else If를 더 줄일 수 있지 않을까 하는 부분인데 아직은 어떻게 해야할 지 잘모르겠습니다.
클래스명, 함수명, 변수명에 좀 더 신경써야겠습니다. 이름만보고 어떤 역할을 하는지 대략적으로나마 알 수 있어야 합니다.
이 문제는 스택 자체를 구현하는 것도 중요하지만
문자열에 대해서 많이 공부할 수 있었습니다. 특히 자바의 String타입에는 다양한 메소드들이 포함되있는데요,
문자열 검색을 위한 contains()와 문자열을 자르는 split이 여기서 중요했고 또 공부했습니다.
또한 처음에 문자열의 비교를 '=='으로 비교했는데, ==으로 했을 때 에러가 발생했습니다.
왜냐하면 ==는 주솟값을 비교하는 것이기 때문입니다. Value를 비교하기 위해선 equal()을 사용해야만 합니다.
또 이전 포스팅인 문제 해결 전략을 이 문제를 풀면서 적용했습니다.
문제에 바로 들어가기전에 문제가 요구하는 바가 무엇인지 목표가 무엇인지, 제약 사항은 무엇인지 생각했으며
어떤 알고리즘과 자료구조를 사용할지에 대해서 고민해봤습니다.
'Problem Solving' 카테고리의 다른 글
백준 14890번(Java) 경사로 (0) 2021.06.04 백준 14891번, 톱니바퀴 (0) 2021.05.01 백준 1260, DFS와 BFS (0) 2020.04.26 프로그래머스 Level2 - 탑 (0) 2020.04.24 알고리즘, 문제 해결 전략부터 (0) 2020.04.22