컴퓨터 프로그래밍/알고리즘

프로그래머스-쇠막대기

깝돌이 2020. 6. 6. 22:23

https://programmers.co.kr/learn/courses/30/lessons/42585

 

코딩테스트 연습 - 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 합니다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자릅니다. 쇠막대기와 레�

programmers.co.kr

<내 풀이>

왼쪽 괄호의 객수에 따라서 레이저로 자르면 그 숫자만큼 막대가 새로 생깁니다. 그렇기 때문에 ()의 의미는 왼쪽 갯수만큼 )(생성해줍니다. arrangement를 복사하는 새로운 배열을 만들되, 레이저가 나오게 되면 )(추가로 넣어줍니다. 레이저의 판별법은 i번째에 )이것이 나왔을때 바로 그전에 것이 ( 이게 나오면 됩니다. 콛는 아래와 같습니다. 

import java.util.ArrayList;
class Solution {
    public int solution(String arrangement) {
       int answer = 0;
        int numLeft=0;
        String[] arr=arrangement.split("");
        ArrayList<String> list = new ArrayList<>();
        
        for(int i =0; i<arr.length;i++) {
        	if(arr[i].equals("(")){
        		numLeft++;
        		list.add("(");
        	}else if(arr[i].equals(")")) {
        		numLeft--;
        		if(arr[i-1].equals("(")) {
        			list.remove(list.size()-1);
        			for(int j=0;j<numLeft;j++) {
        				list.add(")");
        			}
        			for(int j=0;j<numLeft;j++) {
        				list.add("(");
        			}
        		}else {
        			list.add(")");
        		}
        		
        	}
        }
        answer=list.size()/2;
                
        return answer;
    }
}

1번 테스트에서 시간 초과가 떴습니다. 

그래서 ArrayList를 없애 버렸습니다. 

package algorithm_2;

public class l13 {
    public static int solution(String arrangement) {
        int answer = 0;
        int numLeft=0;
        String[] arr=arrangement.split("");
        
        for(int i =0; i<arr.length;i++) {
        	if(arr[i].equals("(")){
        		numLeft++;
        		answer++;
        	}else if(arr[i].equals(")")) {
        		numLeft--;
        		if(arr[i-1].equals("(")) {

        			answer+=(numLeft*2-1);
        		}else {
        			answer++;
        		}
        		
        	}
        }
                
        return answer/2;
        
    }
	public static void main(String[] args) {
	String arrangement ="()(((()())(())()))(())";
		
		System.out.println(solution(arrangement));
	}

}

 다른 풀이는 대부분 stack을 이용해서 풀었길래. 그냥 건너 뛰었습니다.