- 문제 출처 : https://www.acmicpc.net/problem/9012
1. 생각
처음으로 JAVA를 활용하여 코딩테스트 문제를 풀어보게 되었다.
기존엔 C만 사용해오다보니 확실히 언어적인 문제가 많이 부딪힐 것으로 예상되어,
자료구조까지 어려운걸 풀면 머리가 터질 것 같아 스택 문제 카테고리에서 문제를 선정헀다.
간단한 괄호 문제인데, 스택을 쓴다는 것을 이미 인지한 상태에서 푸니까 어려울 건 없었다.
완성된 괄호의 문자열이면 YES, 불완전한 괄호의 문자열이면 NO를 반환하면 되므로,
스택을 활용하여 '(' 는 스택의 push, ')' 는 스택의 pop으로 활용하면 될 것이라고 기틀을 잡고 시작했다.
2. 난관 & 해결 방법
static int top;
static int stacks[] = new int[50];
우선 스택과 스택의 가장 위에 있는 요소의 인덱스인 top을 정의해줬다.
push와 pop에 활용하여, top이 0이거나 최대치인 50에 도달하면 각각 상황에 맞게 도출해줄 것이다.
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
sc.nextLine();
자바에서의 시스템 입력인 Scanner 를 처음 활용해보는 것이라,
문제에서의 입력인 '정수 + 문자열'을 받을 때, nextInt()를 사용한 뒤에 '/n' 이 남아 버리는 것을 처음 알았다.
계속 처음 정수 입력 nextInt() 이후의 nextLine이 다음 문자열이 아니라 빈줄이 들어가는 것 같아서,
출력을 해봤더니 개행이 남게 된다는 것을 확인하였다. 따라서 nextInt() 이후 nextLine()을 함께 해주어 빈줄을 날려줬다.
for (int j = 0; j < S.length(); j ++)
{
int res = 0;
if (S.charAt(j) == '(') {
res = pushStack();
}
else if (S.charAt(j) == ')'){
res = popStack();
}
if (res == 1){
top = 1;
break ;
}
}
그 후 받아오는 문자열들 (괄호로 가득한 문자열)을 판별해주는 반복문을 돌려주는데,
또 새로운 charAt() 이라는 함수를 발견했다.
정말 Java는 기본 문법만 알고 시작한터라, 이런 문자열 활용 함수를 처음 알게 되었는데
예전 C에서는 char 자료형과 index로 접근했다면, Java에서는 String 자료형과 charAt(int index)를 활용한다.
단순히 해당 인덱스에 어떤 문자가 있는지 반환해준다.
따라서 ( ) 각각 push, pop으로 대응해주었다.
static int pushStack(){
if (top >= 50)
return (1);
stacks[top] = 1;
top ++;
return (0);
}
static int popStack(){
if (top == 0)
return (1);
stacks[top] = 0;
top --;
return (0);
}
push와 pop이다.
push를 했을 때는 스택이 꽉차있으면 최대치를 초과하였으므로 NO를 반환하기 위해 바로 return 해주었고,
pop을 했을 때는 스택이 비어있는데 pop을 했으므로, 괄호 앞부분이 없는 상태에서 뒷부분이 나온 케이스라
이를 NO를 반환하도록 return 해주었다.
괄호에 따라 push pop을 해주고, 문자열을 모두 판별했을 때, top (남은 스택의 최상단 인덱스) 이 0이 아니면
괄호 앞부분은 남아있지만, 뒷부분이 오지 않은 케이스이므로, 이를 NO로 반환하도록 추가 코드를 작성했다.
3. 코드 및 결론
[ 전체 코드 ]
import java.util.Scanner;
public class Main {
static int top;
static int stacks[] = new int[50];
static int pushStack(){
if (top >= 50)
return (1);
stacks[top] = 1;
top ++;
return (0);
}
static int popStack(){
if (top == 0)
return (1);
stacks[top] = 0;
top --;
return (0);
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
sc.nextLine();
for (int i = 0; i < T; i ++)
{
top = 0;
String S = sc.nextLine();
for (int j = 0; j < S.length(); j ++)
{
int res = 0;
if (S.charAt(j) == '(') {
res = pushStack();
}
else if (S.charAt(j) == ')'){
res = popStack();
}
if (res == 1)
{
top = 1;
break ;
}
}
if (top == 0)
{
System.out.println("YES");
}
else
{
System.out.println("NO");
}
}
sc.close();
}
}
[ 결론 ]
단순한 구조의 문제이므로, JAVA의 활용법을 하나씩 익혀가는데에 적합한 쉬운 문제였다.
리팩토링을 하지않고 상당히 러프한 코드로 제출하긴 했다만
차근차근 다음 문제들을 풀어가면서 깔끔한 코드를 작성 해봐야겠다.
우선 스택 자료구조는 예전에 문제를 조금 풀어봐서 익숙했으나
문제가 어려워지면 스택인지 판별하기가 까다로울 수 있으니 많은 문제를 자주 풀어봐야겠다.
'프로그래밍 > Algorithm' 카테고리의 다른 글
[BOJ] 백준 2164번: 카드 2 (C++) (0) | 2025.04.07 |
---|---|
[BOJ] 백준 18258번: 큐 2 (C++) (0) | 2025.04.07 |
[BOJ] 백준 4949번: 균형잡힌 세상 (C++) (0) | 2025.04.06 |
[BOJ] 백준 10773번: 제로 (C++) (0) | 2025.04.06 |
[BOJ] 백준 10828번: 스택 (JAVA) (0) | 2025.04.05 |