[프로그래머스][java] lv 2 올바른 괄호

2024. 11. 20. 11:43·코테/java

1. 문제 설명

 

2. 나의 풀이

    public static boolean solution(String s) {
        boolean answer = true;
        int cnt = 0;
        for(int i = 0; i < s.length(); i++)
		{
        	if(s.charAt(0) == ')')
			{
				return false;
			}
        	if(s.charAt(i) == '(')
			{
				cnt++;
			}
        	else
        	{
        		cnt--;
        	}
		}
        if(cnt != 0){answer = false;}
        	
        return answer;
    }

처음 짠 오답 ;;

스택으로 풀고 싶었는데 안 써봐서 어떻게 해야할지 모르겠더라.

gpt 선생님께 문제 주고 힌트 달랬더니 카운트로 푸는 걸 권장한대서 이렇게 짰음

틀린 이유

첫 번째 문자가 )인지 확인하는 조건 if(s.charAt(0) == ')')가 너무 초기 단계에서만 검사되고, 이후의 균형을 확인하지 않음.괄호의 균형을 확인하려면 카운터가 음수가 되는 순간을 바로 false로 처리해야 함.

즉, cnt 값이 음수가 되는 경우는 이미 닫는 괄호 )가 여는 괄호 (보다 많아졌음을 의미하므로, 그 즉시 false를 반환.

 

수정한 코드

class Solution {
    boolean solution(String s) {
        boolean answer = true;
        int cnt = 0;
        for(int i = 0; i < s.length(); i++)
		{
        	if(s.charAt(i) == '(')
			{
				cnt++;
			}
        	else
        	{
        		cnt--;
        	}
        	if(cnt < 0){return false;}
		}	
        return cnt == 0;
    }
}

1. for문 안에서 cnt가 음수가 되는지 확인하여, 균형이 깨지는 즉시 return false

2.cnt == 0 이어야 균형이 맞는 것이므로 if(cnt == 0){answer = true;} 할 필요 없이 그냥 바로 비교식을 return해줌

 

 

3. 다른 사람의 풀이

import java.util.Stack;
class Solution {
    boolean solution(String s) {
        boolean answer = true;  
        String res = "YES";
        Stack<Integer> st = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '(') {
                    st.push(1);
                } else if (s.charAt(i) == ')') {
                    if (st.isEmpty()) {
                        answer = false;
                        break;
                    } else {
                        st.pop();
                    }
                }
            }

            if(!st.isEmpty()) {

                answer = false;

            }

            System.out.println(res);
return answer;
    }   

}

Jungjin Park 님의 풀이.

stack으로 푼다면 어떻게 풀어야할지 참고하려고 갖고왔다.

빈 스택에 push로 '(' 나 ')' 가 아닌 그냥 아무거나 넣어도 되는구나! 

나는 아직 이런 발상을 잘 못하는 것 같다..문제에서 ( )가 나오고 스택이면 당연히 스택에 (을 넣을 생각부터 한다.

(가 나오면 1을 넣고, 짝이 맞으면 다시 pop으로 빼내고.

최종적으로 st이 비어있어야 true를 반환하는 방식이다. 다음에 스택/큐 문제가 나오면 써봐야겠다,

 

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

'코테 > java' 카테고리의 다른 글

[프로그래머스][java] lv 0 배열 회전시키기  (0) 2024.11.20
[프로그래머스][java] lv 0 대문자와 소문자  (1) 2024.11.20
[프로그래머스][java] lv 2 혼자 놀기의 달인  (0) 2024.11.19
[프로그래머스][java] lv 0 숨어있는 숫자의 덧셈(1)  (2) 2024.11.18
[프로그래머스][java] lv.0 가위바위보  (0) 2024.11.18
'코테/java' 카테고리의 다른 글
  • [프로그래머스][java] lv 0 배열 회전시키기
  • [프로그래머스][java] lv 0 대문자와 소문자
  • [프로그래머스][java] lv 2 혼자 놀기의 달인
  • [프로그래머스][java] lv 0 숨어있는 숫자의 덧셈(1)
니누고
니누고
주니어 개발괴발자
  • 니누고
    진땡이코딩조림
    니누고
  • 전체
    오늘
    어제
    • 분류 전체보기 (93)
      • 편안한코딩생활 (12)
        • 오류 해결 일지 (6)
        • 기타등등 (6)
      • 백 (23)
        • jsp (1)
        • spring boot (7)
        • spring (7)
        • 전자정부프레임워크 (8)
      • 프로젝트 (13)
        • 블로그 제작(중단) (12)
      • 프론트 (3)
        • javascript (3)
      • 데이터베이스 (6)
        • oracle (5)
        • 그 외 (1)
      • cs (6)
        • java (4)
        • cs (1)
        • C (1)
      • 코테 (26)
        • java (25)
        • sql (1)
      • 앱 (0)
        • flutter (0)
        • dart (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    컴퓨터용량줄이기
    JPA
    대문자와소문자
    egov
    티스토리챌린지
    apache
    Java
    spring
    jpa #springboot
    Oracle
    가장 큰 수 찾기
    문자열 정렬하기
    SpringBoot
    tomcat
    오블완
    iBatis
    배열
    코딩테스트
    함수
    2017팁스다운
    전자정부프레임워크
    스프링의 기본 파싱전략
    배열 회전시키기
    Eclipse
    카카오 블라인드 채용
    중복된 문자 제거
    CRUD
    mod_jk.log
    프로그래머스
    oracle함수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
니누고
[프로그래머스][java] lv 2 올바른 괄호
상단으로

티스토리툴바