728x90
유사한 문제를 많이 풀었다고 생각했어서
금방 풀 수 있을줄 알았는데... 중간에 포기하고 말았다...!
이 문제는 Queue구조와 같이 가장 먼저 들어온 숫자를 뒤로 빼주는 것과 대칭되는 값이 다음 원소로 존재할 때 Pop 하는 것이 관건이다.
개념은 알았지만 문제가 생각만큼 잘 안풀리고 시간초과가 너무 많이 나서 결국 여러 블로그를 참고했다.
(대놓고 참고한 블로그: https://velog.io/@leeesangheee/Level-2-%EA%B4%84%ED%98%B8-%ED%9A%8C%EC%A0%84%ED%95%98%EA%B8%B0-Swift)
이 문제를 풀면서 생각한 논리적 흐름
- startIndex를 이용해 0부터 s.count 전 정수값까지 index위치 값을 설정한다.
- str에 [0...s.count] + [], [1...s.count] + [0], [2...s.count] + [0, 1] 개념으로 값의 위치를 조정해준다.
- isCorrect 함수를 활용해 회전시키는 동안 몇번의 케이스가 나왔는지 확인한다.
- isCorrect 함수 내에서 queue가 비어 있으면 s의 문자열을 넣어준다.
- 마지막으로 들어온 원소가 "(", "{", "[" 중 어떤 케이스인지 확인하고
- 각각의 케이스에 대칭인 값이 다음 원소로 나오는지 확인한다.
- 다음 원소가 대칭 값이라면 remove.Last를 통해 원소를 Pop시킨다.
- 반복한다.
- 이렇게 반복하여 값이 empty인 경우 count += 1 해주고
- s를 s의 원소 미만으로 회전시켜 값을 구한다.
* 코드
func solution(_ s: String) -> Int {
var count = 0
for offset in 0..<s.count {
let startIndex = s.index(s.startIndex, offsetBy: offset)
let str = s[startIndex..<s.endIndex] + s[s.startIndex..<startIndex]
if isCorrect(String(str)) { count += 1 }
}
return count
}
func isCorrect(_ s: String) -> Bool {
var queue: [Character] = []
for i in s {
if queue.isEmpty {
queue.append(i)
} else {
guard let last = queue.last else { continue }
switch last {
case "[": if i == "]" { queue.removeLast() } else { queue.append(i) }
case "(": if i == ")" { queue.removeLast() } else { queue.append(i) }
case "{": if i == "}" { queue.removeLast() } else { queue.append(i) }
default: queue.append(i)
}
}
}
return queue.isEmpty
}
사실 타 블로그를 참고하면서 좀 감탄했다. 여러가지 코드가 있었고 시간 효율성이 압도적으로 높은 대단한 코드들도 많았지만... 뭔가 한 눈에 들어오는 코드는 내가 참고한 위 코드였다. 보면서 정말 깔끔하게 잘 만들었고 코드에 어떤 의도가 들어있는지 한 눈에 파악할 수 있어서 좋았다. 협업을 위한 코드라면 가독성, 일관성이 중요하다는 말이 뭔지 다시 한 번 느꼈다!
정리(Today I Learned)
- 개념을 아는 것과 코드로 그 개념을 구현하는 것은 정말 다른 일인 것 같다. 내 머릿속으로는 굉장히 쉬운데 왜 컴퓨터는 이게 안되지? 왜 Swift는 이런 간단한 내부 함수가 없는거지? 등의 생각이 든다... 하지만 결국 이 말은 그 간단한 내부 함수를 내가 만드는 것이 어렵고 귀찮은 일이라는 반증이겠지..! 그만큼 코드를 짜는 것은 보통일이 아닌 것 같다. 많은 노력과 레거시의 산물이라는 생각이 든다.
'TIL > 알고리즘 공부' 카테고리의 다른 글
프로그래머스 Lv. 2 Swift 알고리즘 - 튜플 (0) | 2023.01.06 |
---|---|
프로그래머스 Lv. 2 Swift 알고리즘 - 위장 (0) | 2023.01.06 |
프로그래머스 Lv. 2 Swift 알고리즘 - 행렬의 곱셈 (0) | 2023.01.05 |
프로그래머스 Lv. 2 Swift 알고리즘 - [1차] 캐시 (0) | 2023.01.04 |
프로그래머스 Lv. 2 Swift 알고리즘 - H-Index (0) | 2023.01.04 |