상세 컨텐츠

본문 제목

[Programmers] Lv.2 괄호 회전하기 (Go)

Development/Algorithm

by thisisnew 2022. 12. 1. 00:02

본문

반응형

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {}는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, []가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {}와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • s의 길이는 1 이상 1,000 이하입니다.

Solution

type braceStack []string
var bs braceStack

func (bs *braceStack) pop() string {

	if len(*bs) == 0 {
		return ""
	}

	var result = (*bs)[len(*bs)-1]
	*bs = (*bs)[:len(*bs)-1]

	return result
}

func (bs *braceStack) push(s string) {
	*bs = append(*bs, s)
}


func solution(s string) int {
  	var result int
	var origin = s

	for {
		if isValidBraces(s) && len(bs) == 0 {
			result++
		}

		s = moveTokenLeft(s)

		if s == origin {
			break
		}
	}

	return result
}

func moveTokenLeft(s string) string {
	return s[1:] + s[0:1]
}

func isValidBraces(bs string) bool {
	for _, s := range bs {
		if isBraceLocked(string(s)) {
			continue
		}

		return false
	}

	return true
}

func isBraceLocked(b string) bool {

	switch b {
	case "(", "{", "[":
		bs.push(b)
	case ")":
		p := bs.pop()

		if p != "(" {
			return false
		}
	case "}":
		p := bs.pop()

		if p != "{" {
			return false
		}
	case "]":
		p := bs.pop()

		if p != "[" {
			return false
		}
	}

	return true
}

반응형

관련글 더보기

댓글 영역