func AND(_ firstOperands: Stack<Int>, _ secondOperands: Stack<Int>) -> Int {
let resultStack = Stack<Int>()
while !firstOperands.isEmpty() || !secondOperands.isEmpty() {
if (firstOperands.peek() == 1) && (secondOperands.peek() == 1) {
resultStack.push(1)
firstOperands.pop()
secondOperands.pop()
} else {
resultStack.push(0)
firstOperands.pop()
secondOperands.pop()
}
while !resultStack.isEmpty() {
result = resultStack.peek()!
return result
resultStack.pop()
}
return result // 스텍값을 Int로 어떻게 보내야해??? 문제 봉착 🤔
}
스텍이 결과값이 제대로 나올리가 없는데???
급한 마음에 ㅠㅠ
그냥 (결과값 순서 무시) 꾹꾹 눌러담았다 ^.^
func AND(_ firstOperands: Stack<Int>, _ secondOperands: Stack<Int>) -> Int {
let resultStack = Stack<Int>()
**var resultString = ""**
while !firstOperands.isEmpty() || !secondOperands.isEmpty() {
if (firstOperands.peek() == 1) && (secondOperands.peek() == 1) {
resultStack.push(1)
} else {
resultStack.push(0)
}
firstOperands.pop()
secondOperands.pop()
}
while !resultStack.isEmpty() {
resultString += "\(resultStack.peek()!)"
resultStack.pop()
}
**return Int(resultString)!**
}
String으로 결과값을 연달아 붙여주고 다시 Int로 변환해서 return
(Int로 변환해야 함. 왜냐면 첫 번째줄에서 return 값이 Int라고 얘기해줬는데 안 그러면 미스매칭돼서 오류남)
테스트를 계속 하다가 의도치 않게(?) 오류를 발견했다 ^.ㅠ
이진법 덧셈 계산에서 자릿수가 안 맞는 경우 Pop에서 오류가 난다...
예를 들어 하나는 3자리고
하나는 2자리인데
2자리는 이미 팝이 다 돼서 빈 스텍이 됐는데도
pop함수가 계속 돌아가니까...
아무것도 없는데 뭘 remove하라는 거야?라고 빨간 경고창이 뜸.
다음날 해결했다 ^.^;
func AND(_ firstOperands: Stack<Int>, _ secondOperands: Stack<Int>) -> Int {
let resultStack = Stack<Int>()
var resultString = ""
while !firstOperands.isEmpty() || !secondOperands.isEmpty() {
if (firstOperands.peek() == 1) && (secondOperands.peek() == 1) {
resultStack.push(1)
} else {
resultStack.push(0)
}
if firstOperands.isEmpty() {
firstOperands.push(0)
} else {
secondOperands.push(0)
}
firstOperands.pop()
secondOperands.pop()
}
while !resultStack.isEmpty() {
resultString += "\(resultStack.peek()!)"
resultStack.pop()
}
return Int(resultString)!
}
A. 1100 & 10
이진법에서 자릿수가 안 맞는다는 개념은 없음
그냥 0으로 채워주고 계산하는 거임
위의 경우
1100 & 0010을 계산하는 거임!
→ 스텍에서 값을 각각 비교 한다음에
만약에 스텍이 비어있으면
그냥 0을 넣어준다음에
계산 처리함
Q. Int를 String으로 바꿔주려면?
A. firstOperand → Int였는데
(firstOperand)→ 이렇게 하면 String으로 변함
extension StringProtocol {
var digits: [Int] { compactMap(\.wholeNumberValue) }
}
digits은 그냥 확장해서 넣어준거임 저런 역할을 하게.
.digit을 쓰면 "1100"이 배열이 된다로 이해하면 됨
Q. 2진법 계산에서 왜 스텍을 써야 하는가? 그냥 배열로 하면 안되나?
A. 스텍을 쓰는 이유? 배열이 불안전해서!
Q. 스텍이 유용하게 쓰이는 경우?
→ 후위 표기법