99클럽 코테 스터디 7일차 TIL + 스택/큐

개발자 춘식이·2025년 4월 8일
0

항해99클럽

목록 보기
7/10

문제

백준 3986번-좋은 단어
평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 '좋은 단어'이다. 평석이가 '좋은 단어' 개수를 세는 것을 도와주자.

입력:
첫째 줄에 단어의 수 N이 주어진다. (1 ≤ N ≤ 100)

다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.

출력:
첫째 줄에 좋은 단어의 수를 출력한다.

예시

입력:

3
ABAB
AABB
ABBA

출력:

2

풀이

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int result = 0;    // 좋은 단어 갯수
        int num = sc.nextInt();
        sc.nextLine();
        
        for (int i=0; i<num; i++) {
            String line = sc.nextLine();
            
            if (isGoodWord(line)) {
                result++;
            }
        }
        System.out.print(result);
    }
    
    private static boolean isGoodWord(String line) {
        Stack<Character> stack = new Stack<>();
        
        for (char ch:line.toCharArray()) {
            if (!stack.isEmpty() && stack.peek() == ch) {
                stack.pop();	// 짝이 맞으면 제거
            } else {
                stack.push(ch);	// 짝이 아니면 추가
            }
        }
        
        return stack.isEmpty();	// 비어 있어야 좋은 단어
    }
}
  1. line.toCharArray()는 문자열을 문자 배열로 바꾸는 메소드이다.
  2. for-each 문으로 line의 각 문자를 하나씩 ch에 꺼내서 반복한다.
  3. 만약 스택이 비어있지 않고 스택의 맨 위 문자와 지금 문자가 같으면 pop()을 통해 제거한다.
  4. 그렇지 않다면 push()를 통해 스택에 값을 추가한다.
  5. 스택 마지막이 비어있으면 좋은 단어로 간주하고 result++를 진행한다.

회고

시간이 없다.. 시간을 내자

profile
춘식이를 너무 좋아하는 주니어 백엔드 개발자입니다.

0개의 댓글