250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • 카카오
  • 코딩테스트
  • data
  • 구현
  • DP
  • ADsP
  • 백준
  • 브루트포스
  • JAVA8
  • 문제풀이
  • BOJ
  • swift
  • 머신러닝
  • java
  • 파이썬
  • SpringMVC
  • 프로그래머스
  • 개발자
  • BFS
  • ios
  • JPA
  • Front-end
  • 개발
  • 자바
  • Python
  • uArm
  • AI
  • 선형대수
  • 알고리즘
  • certificate

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim

Hello World!

[PGM_12973] 짝지어 제거하기 (java)
CodingTest/Programmers

[PGM_12973] 짝지어 제거하기 (java)

2022. 1. 31. 11:16
728x90
728x90

문제링크

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

 

코딩테스트 연습 - 짝지어 제거하기

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙

programmers.co.kr

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
Stack

 연속되는 문자열을 짝지어서 제거해주는 문제이다. 처음에 문제를 해결할 때 subString을 사용해서 붙이고 모든 문자열을 돌아도 괜찮다고 생각이 되어 그렇게 문제를 해결하였다. 그러나 효율성에서 점수를 받지 못하여, 새로운 방법을 고안하다가 스택을 사용해서 문제를 해결하게 되었다. (스택을 사용한게 효율이 더 좋은 이유는 String의 작업이 생각보다 많은 시간이 걸리기 때문이다.)

 

문자 두개를 확인하고 문자가 같으면 버리고, 다르면 스택에 넣는 방법으로 구현하였다.

  1. 스택이 비어있는지 확인하고, 비어있으면 문자 하나를 넣어주고 다음 문자로 넘어간다.
  2. 만약 스택이 비어있지 않다면, 그 문자를 꺼내고 지금 배열에서 포인트되어있는 문자와 비교한다.
    • 만약 같으면 다시 스택에 넣지 않고 다음 문자로 넘어간다.
    • 만약 다르면 다시 스택에 순서대로 넣어준다.(스택에 있던 문자를 먼저 넣고 그 다음 문자를 넣어준다.
  3. 모든 문자를 확인할 때 까지 1번과 2번을 반복 시행한다.
  4. 모든 문자를 확인하였다면 결과를 리턴한다.
    • 스택이 비어있으면 1
    • 스택이 비어있지 않으면 0

 

구현코드

package pgm_12973;

import java.util.Stack;

public class Solution {
    public int solution(String s) {
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if(stack.isEmpty()){
                stack.add(s.charAt(i)-'0');
                continue;
            }

            int front = stack.pop();
            int back = s.charAt(i) -'0';

            if(front == back)
                continue;
            stack.add(front);
            stack.add(back);
        }

        if (stack.isEmpty())
            return 1;
        return 0;
    }
}

 

시간복잡도

모든 문자열을 한번씩 확인하기 때문에 문자열의 크기 n이 된다. $O(n)$

잘못된 지식이나 궁금한 내용이 있을 경우 편하게 댓글 남겨주시면 감사하겠습니다 :)

 

728x90
728x90
저작자표시 비영리 (새창열림)

'CodingTest > Programmers' 카테고리의 다른 글

[PGM_72411] 메뉴 리뉴얼 (java)  (0) 2022.02.04
[PGM_77485] 행렬 테두리 회전하기 (java)  (0) 2022.02.01
[PGM_43165] 타겟 넘버 (java)  (0) 2022.01.31
[PGM_42626] 더 맵게 (Java)  (0) 2022.01.30
[PGM_42626] 더 맵게 (Java)  (0) 2022.01.30
    'CodingTest/Programmers' 카테고리의 다른 글
    • [PGM_72411] 메뉴 리뉴얼 (java)
    • [PGM_77485] 행렬 테두리 회전하기 (java)
    • [PGM_43165] 타겟 넘버 (java)
    • [PGM_42626] 더 맵게 (Java)
    JinSeopKim
    JinSeopKim
    기록📚

    티스토리툴바