분수의 덧셈 [Swift]

김형준·2023년 6월 3일
0

코딩문제

목록 보기
4/9

문제 해결에 필요한 공부
-stride
-for 반복문
-if 조건문

첫번째 답안지

func solution(_ numer1:Int, _ denom1:Int, _ numer2:Int, _ denom2:Int) -> [Int] {
    
    var a = numer1 * denom2 + numer2 * denom1
    var b = denom1 * denom2
    
    for i in 2...b.words.reversed() {
        
        if a % i == 0 && b % i == 0{
            a /= i
            b /= i
                    
            
            continue
        } else {continue}
        }
        
    return [a,b]
    }

최종 답안지

import Foundation

func solution(_ numer1:Int, _ denom1:Int, _ numer2:Int, _ denom2:Int) -> [
 Int] {
    var a = numer1 * denom2 + numer2 * denom1 //numer1
    var b = denom1 * denom2
    
    for i in stride(from: b, through: 1, by: -1) {
        
        if a % i == 0 && b % i == 0{
            a /= i
            b /= i
            continue
        } else {continue}
        }
    return [a,b]
}

문제설명

일상 수학에서는 분수,분모를 그냥 쉽게 나누면 되지만, 코드에 나타내기는 생각보다 쉽지 않았다.

먼저 공통분모를 만들고 분자에 공통분모를 곱해주면서 시작했다. 처음에는 분모의 배수를 찾아서 소수점 구하는 것처럼 반목문을 통해서 찾고 분자와 분모를 나눠줄 생각이었지만 실패..

가장 중요한 핵심은 if조건문을 사용해서 나눈 값을 변수에 새롭게 담아줘야하는데 이걸 몰랐다.

그래서 알게 된 a /= i ( a 값을 b 값으로 나눈 값을 a 에 할당)

만약 10 % 5 나머지가 0이기 때문에 나눌수 있게 되면 10 /= 5( 10을 5로 나누면 2, 그리고 2를 a에 다시 할당한다는 뜻이다).

하지만, 아직 이해 안되는건 처음에 var a 를 선언했는데 10 /= 5 통해서 2를 a에 담게 되었다면 데이터가 어떻게 변하는지 모르겠음. For 문 안에서 a의 데이터(10->2) 변하면서 재차 가능한건지? 잘모르겠음(사실 코딩초보..)

여차여차해서 문제를 풀기는했지만 70%만 맞다고 나와서 왜지? 계속 생각하면서 큰수를 나눌때는 큰 숫자부터 작은숫자로 나눠야만 제대로 나눠지는 것을 깨달음.. 결국 For 반복문에서 for i in 1...100을 역순으로 해야했지만 Int는 또 reversed() 가 안됨...

그래서 사용한 stride 함수 (하나하나 성큼성큼 걷는다는 의미)

for i in stride(from: b, through: 1, by: -1) 를 통해서 from b부터 through 1까지 -1 마다 걷는다는 의미로 해석하면 된다. 이를 통해 b = 30이라면 -1씩 줄어들면서 29, 28, 27, 26 역순으로 for문을 반복하게 된다.

아 그리고 Int만 % 으로 나머지 구하는게 가능함..

Double/ Float으로 % 을 사용하기 위해서는 truncatingRemainder(dividingBy:) 메서드를 사용해야한다.

-추가 궁금증 : 1000, 10000 숫자를 넣으면 엄청난 반복 계산을 해야하는데, 이걸 간단히 해결할 수 없을까?

결론: 코딩을 풀면서 swift 문법을 알고 있어도 어떻게 활용하고, 논리적으로 작성해야하는지 알게되면서 코딩테스트를 통해 이러한 사고력을 기를 수 있을 거라 확신한다.(물론 어렵지만🥲)

profile
기억보단 기록, 느리더라도 꾸준히

0개의 댓글