210401 Thu

Sunny·2021년 4월 3일
0

Today I Learned

목록 보기
24/88

이진법 AND 계산 함수 - Stack을 이용한 구현 방법

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)!**
 }
  • firstOperands.pop()와 secondOperands.pop()는 2번 반복하지 말고 while문 안 & if문 밖으로 빼주면 됨
  • 스택에 있는 값을 바로 Int로 연달아 내보내지 못함.

String으로 결과값을 연달아 붙여주고 다시 Int로 변환해서 return

(Int로 변환해야 함. 왜냐면 첫 번째줄에서 return 값이 Int라고 얘기해줬는데 안 그러면 미스매칭돼서 오류남)

문제점/고민한점 → 해결방안 🤔

테스트를 계속 하다가 의도치 않게(?) 오류를 발견했다 ^.ㅠ

이진법 덧셈 계산에서 자릿수가 안 맞는 경우 Pop에서 오류가 난다...

예를 들어 하나는 3자리고

하나는 2자리인데

2자리는 이미 팝이 다 돼서 빈 스텍이 됐는데도

pop함수가 계속 돌아가니까...

아무것도 없는데 뭘 remove하라는 거야?라고 빨간 경고창이 뜸.

To be continued...

다음날 해결했다 ^.^;

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)!
 }

Q. 이진법 계산 자릿수 안 맞을때 어떻게?

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. 스텍이 유용하게 쓰이는 경우?
→ 후위 표기법

profile
iOS Developer

0개의 댓글