문제
https://programmers.co.kr/learn/courses/30/lessons/42585
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public int solution(String arrangement) { char[] ch = arrangement.toCharArray();
int answer = 0; char pre = 0; Stack<Character> stack = new Stack<Character>(); for (char c : ch) { if (c == '(') { stack.push(c); } else { stack.pop(); if (pre == c) { answer += 1; } else { answer += stack.size(); } }
pre = c; }
return answer; }
|
흐름
- 문자열을 char array로 변경
- char array를 반복하면서 문자가 ‘(‘ 인지 비교
- 맞으면 새 막대기가 시작되야 하므로 stack에 push 함
- 아니라면 레이저를 발사해서 stack을 잘라야 하므로 pop 하는데
- 이전 pop한 문자가 똑같이 ‘)’ 이라면 하나만 더 짤린 것이므로 +1 만하고
- 이전 문자가 ‘)’이 아니라면 stack의 크기가 막대의 개수 이므로 stack size만큼 더함
- 막대를 하나만 추가할 지 판단하기 위해 현재 문자를 저장함
- 문자열을 모두 반복 하면 끝
결과
번호 |
속도 |
테스트 1 |
통과 (19.66ms, 51.2MB) |
테스트 2 |
통과 (1.24ms, 53MB) |
테스트 3 |
통과 (19.95ms, 51MB) |
테스트 4 |
통과 (2.78ms, 53.1MB) |
테스트 5 |
통과 (4.04ms, 53MB) |
테스트 6 |
통과 (3.95ms, 52.8MB) |
테스트 7 |
통과 (14.81ms, 52.5MB) |
테스트 8 |
통과 (16.84ms, 52.6MB) |
테스트 9 |
통과 (17.09ms, 52.8MB) |
테스트 10 |
통과 (16.32ms, 52.6MB) |
테스트 11 |
통과 (13.59ms, 52.2MB) |
테스트 12 |
통과 (14.53ms, 50.6MB) |
테스트 13 |
통과 (15.35ms, 52MB) |
테스트 14 |
통과 (17.90ms, 50.4MB) |
테스트 15 |
통과 (18.95ms, 52.3MB) |
테스트 16 |
통과 (20.62ms, 50.7MB) |
테스트 17 |
통과 (20.66ms, 53.1MB) |
테스트 18 |
통과 (18.49ms, 52.8MB) |
테스트 19 |
통과 (19.85ms, 53MB) |
테스트 20 |
통과 (18.93ms, 52.5MB) |
테스트 케이스
1 2
| assertEquals(17, test.solution("()(((()())(())()))(())")); assertEquals(18, test.solution("(((((((((())))))))))"));
|