https://school.programmers.co.kr/learn/courses/30/lessons/12909
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return - 주어진 자료는 무엇인가?
- 문자열 s - 조건은 무엇인가?
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
2. 계획
- s의 (개수와 )개수가 같다면 true
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (s) => {
// s의(개수와)개수가 같다면 true
let count = 0;
for (i = 0; i < s.length; i++) {
if (s[i] === '(') {
count++
} else {
count--
}
if (count < 0) {
return false
}
}
return count === 0 ? true : false;
}
test('trueOrFalse', () => {
expect(solution("()()")).toEqual(true);
expect(solution(")()(")).toEqual(false);
expect(solution('())())')).toEqual(false);
expect(solution("())()(()")).toEqual(false);
});
4. 반성
- 처음에 split을 사용해서 배열을 만든 다음에 map을 사용했는데 이렇게 되면 split을 사용할때와 map을 사용할 때 효율성이 O(N)이다. 그래서 효율성 테스트 할 때 통과가 안됐다.
- 그래서 split을 사용하지 않고 그냥 문자열을 가지고 for 반복문을 사용했다. 문자열도 배열처럼 인덱스로 접근할 수 있다는 것을 알았다.
- 또 처음에 문자열이 첫번째가 ')' 이거나 마지막이 '(' 인 경우 false를 리턴하게 했는데 효율성 테스트 하나를 통과하지 못했다. 이것도 for 문 안에서 해결이 되는 부분이라 코드를 지워주었더니 효율성 테스트 통과가 되었다.
- 앞으로 효율성 측면에서 더 생각해보고 코드를 작성해야겠다.
- 다른 문자열이 있을 경우 풀어보기
const solution = (s) => {
const str = s.replace(/[^()]/gi, '');
// s의(개수와)개수가 같다면 true
let count = 0;
for (i = 0; i < str.length; i++) {
if (str[i] === '(') {
count++
} else {
count--
}
if (count < 0) {
return false
}
}
return count === 0 ? true : false;
}
test('trueOrFalse', () => {
expect(solution("()a()")).toEqual(true);
});
다른 문자열이 들어갈 경우 정규식을 사용해서 ()를 제외한 모든 문자열 제거를 했다.
'코테연습' 카테고리의 다른 글
120. 문자열 내 p와 y의 개수 Javascript (0) | 2022.09.12 |
---|---|
119. x만큼 간격이 있는 n개의 숫자 Javascript (0) | 2022.09.12 |
117. 최솟값 만들기 Javascript (0) | 2022.09.12 |
116. 이진 변환 반복하기 Javascript (0) | 2022.09.12 |
115. 최댓값과 최솟값 Javascript (0) | 2022.09.12 |
댓글