공부방

Swea 쇠막대기 자르기 본문

문법/알고리즘

Swea 쇠막대기 자르기

코딩 화이팅 2023. 2. 20. 17:43

https://swexpertacademy.com/main/talk/solvingClub/problemView.do?solveclubId=AYWesuzK3nUDFAQK&contestProbId=AWVl47b6DGMDFAXm&probBoxId=AYZtDRl6hzADFARc+&type=PROBLEM&problemBoxTitle=2%EC%A3%BC%EC%B0%A8&problemBoxCnt=3\

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com



문제를 다시 보면, ( 뒤에 (가 나오면 그만큼 막대기의 수가 늘어난다. 그렇게 늘어나다가 )로 닫는 괄호가 나온다면 레이저를 쏜다.

레이저를 쐈을 때 나눠지는 막대기의 갯수는 그동안 ((로 늘어났던 막대기의 갯수만큼 늘어난다. 그렇다면 계속 늘어나는 막대기의 갯수와 레이저를 쐈을 때 나오는 막대기의 갯수를 저장해줄 두개의 변수를 선언해줘야된다. 

그리고 괄호로 인해 저장된 막대기의 갯수와 그동안 더해진 막대기의 갯수가 어떻게 나오는지 생각해보면,

(뒤에 (가 나온다면 막대기의 갯수가 하나씩 늘어나는 것이다. 그리고 (뒤에 )가 나온다면 레이저를 쏘는것이고 그렇다면 지금까지 나왔던 막대기의 갯수만큼 더해주면 된다. )가 나왔을 때 전에 )였다면 이제 막대기의 끝이다. 그 전에 (가 나오는 것은 어짜피 앞에서 (가 나왔을 때 )인 경우에서 더해줬기 때문에 나눠줄 필요가 없고 3개의 경우의 수를 생각해서 조건을 만들어주면 된다.

import java.util.Scanner;

public class swea쇠막대기자르기 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int T=sc.nextInt();
		for (int Tc = 0; Tc < T; Tc++) {
			int stick=0;//스틱의 값을 저장할 변수 선언
			int count=0;//스틱의 값들을 더한 걸 저장할 변수 선언
			String Gwal=sc.next();//괄호의 입력을 받음
			char[] gwal=Gwal.toCharArray();//toCharArray를 통해 문자열을 문자 배열로 선언
			
			for (int i = 0; i < gwal.length; i++) {//괄호의 길이 만큼 반복
				if (gwal[i]=='(') {//만약 나온 값이 여는 괄호일 때
					if (gwal[i+1]=='(') {//다음 값도 여는 괄호라면
						stick++;//막대기의 값을 하나씩 더한다.
					}
					else count+=stick;// ')'라면 레이저이기 때문에 그동안 더해왔던 막대기 값들을 더해준다. 
				}
				else if (gwal[i]==')') {//만약 나온 값이 닫는 괄호일 때
					if (gwal[i-1]==')') {//전에 값도 닫는 괄호였다면
						count++;//더한 값을 하나 더해주고
						stick--;//저장된 막대기의 값을 하나 빼준다.
					}
				}
			}//이걸 계속 반복
			System.out.println("#"+(Tc+1)+" "+count);
		}
	}
}

느낀 점 : 문제를 좀 더 생각해서 분석적으로 봐야겠다.이런 경우의 문제로 보면 막대기의 갯수로 인해 더해지는게 어떻게 나오는지 좀 더 생각해서 모든 문제들도 분석적으로 파악해야겠다.

'문법 > 알고리즘' 카테고리의 다른 글

반복문 사고력  (0) 2023.03.02
큐를 이용한 마이쮸 문제  (0) 2023.02.23
Swea패턴 마디의 길이 / substring  (0) 2023.02.20
빠른 정렬  (0) 2023.02.18
회문  (0) 2023.02.17