본문 바로가기

알고리즘/Lv. 2

프로그래머스 12973 짝지어 제거하기 자바 풀이

728x90

난이도 : Lv. 2

풀이일 : 2409231

https://school.programmers.co.kr/learn/courses/30/lessons/12973

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제


1차 풀이

import java.util.Stack;

class Solution
{
    public int solution(String s)
    {
        int answer = 0;
        Stack<Character> stack = new Stack<>();
        
        for (int i = 0; i < s.length(); i++) {
            char alphabet = s.charAt(i);
            if (!stack.isEmpty() && stack.peek() == alphabet) {
                stack.pop();
            } else {
                stack.push(alphabet);
            }
        }
        if (stack.isEmpty()) {
            answer = 1;
        }
        return answer;
    }
}
  • stack : 문자열 s의 각 글자를 담을 스택
  • for 반복문 : 문자열 s의 길이만큼 반복한다.
    • 만약, 스택이 비어있지 않고, 스택의 마지막 요소가 현재 알파벳과 같다면 스택의 마지막 요소 삭제
    • 스택이 비어있거나, 스택의 마지막 요소가 현재 알파벳과 다르다면 현재 알파벳을 스택에 추가
  • 반복문 종료 후, 스택이 비어있다면 정답은 1, 아니라면 초기화 했던대로 0이 된다.

2차 풀이

import java.util.Stack;

class Solution
{
    public int solution(String s)
    {
        int answer = -1;
        Stack<Character> stack = new Stack<>();
        
        for (int i = 0; i < s.length(); i++) {
            char alphabet = s.charAt(i);
            if (!stack.isEmpty() && stack.peek() == alphabet) {
                stack.pop();
            } else {
                stack.push(alphabet);
            }
        }
        answer = stack.isEmpty() ? 1 : 0;
        
        return answer;
    }
}

 

변화

  • 초기에 주어진 answer를 변경하지 않고, 비어있는지 확인 후 숫자 할당 시 삼항연산자를 사용했다.
  • 파이썬으로 알고리즘 풀 때 더 자주 쓰던 방식이라서 생각나서 해봤다.

배운점

  • Stack<Character> stack = new Stack<>();
    • 처음에는 Stackchar>로 작성하였는데 에러가 발생하였다.
    • 자바의 제네릭 타입은 참조형만 사용할 수 있는데, 기본형 char를 사용해서 에러가 발생하였다고 원인을 파악하였다.
    • char의 래퍼 클래스인 Character를 사용해서 해결하였다.

느낀점

  • 파이썬이 쉽긴 쉽다ㅠ