조급하면 모래성이 될뿐

[프로그래머스]쇠막대기 본문

Algorithm/Programmers

[프로그래머스]쇠막대기

Pawer0223 2019. 11. 5. 18:39

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42585

 

코딩테스트 연습 - 쇠막대기 | 프로그래머스

여러 개의 쇠막대기를 레이저로 절단하려고 합니다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자릅니다. 쇠막대기와 레이저의 배치는 다음 조건을 만족합니다. - 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있습니다. - 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓습니다. - 각 쇠막대기를 자르는 레이저는 적어도 하나 존재합니다. - 레이저는 어

programmers.co.kr

코드

package Programmers.Level2;

public class IronBar {

	public static void main(String[] args) {

		String arrangement = "()(((()())(())()))(())";
		
		int answer = solution(arrangement);
		
		System.out.println(answer);


	}//main
	
    public static int solution(String arrangement) {
        int answer = 0;
        
        // 먼저 레이저를 구분해 준다.
        arrangement = arrangement.replace("()", "U");
        
        // 대상을 처리하면서 막대기 갯수를 세어준다.
        int pipe = 0 ;
        
        char[] pipes = arrangement.toCharArray();
        
        for ( int i = 0 ; i < pipes.length; i++ ) {
        	
        	if ( pipes[i] == '(' ) pipe++; // pipe의 갯수를 새준다.
        	else if ( pipes[i] == ')') { // 닫혔을때는 pipe 하나 빼주고, 잘린거 추가해준다.
        		pipe--;
        		answer++;
        	}else if ( pipes[i] == 'U' ) { // 레이저인경우 pipe개수만큼 출력해준다.
        		answer += pipe;
        	}
        }
        
        return answer;
    }

}//class

후기

문제를 어떻게 코드로 풀어나가느냐가 관건이였던 문제인것같다....

 

너무어렵게만 생각해서 떠올려내지 못했다.. 핵심은 레이저 이전의 '(' 를 잘린 막대기 개수로 보는 것 이다.

 

그리고 ')'까지가 막대기의 끝이다. 고로 ')'도 하나의 막대기 파편이 된다.

 

')'를 만나게되면 하나의 막대기는 이후에 레이저를 만나도 잘리지 않으므로, 세고있던 막대기 갯수를 하나 빼준다.

 

'('를 막대기 갯수로 세야한다는 생각을 하지못했다.. 아직도 더 많은 문제들을 풀면서 사고력을 높여가야겠다..

반응형