컴퓨터 프로그래밍/알고리즘
프로그래머스-쇠막대기
깝돌이
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을 이용해서 풀었길래. 그냥 건너 뛰었습니다.