본문 바로가기
모바일앱/Swift

[알고리즘] 최대공약수와 최소공배수 구하기

by GeekCode 2021. 12. 16.
반응형

용어 설명

공약수: 두 개 이상의 자연수의 공통인 약수

최대공약수:

공약수 중에서 가장 큰 수

 

공배수: 두 개 이상의 자연수의 공통인 배수

최소공배수:

공배수 중에서 가장 작은 수

 

알고리즘

  1. input 입력함수 선언
    1. 구분자설정
    2. 문자형 배열로 전환
    3. 입력값이 없는경우, 띄어쓰기 오류에 대한 처리
    4. 숫자입력이 아닌 경우, 오류처리
    5. 숫자형 배열로 전환
    6. solution 함수에 입력
    7. solution함수에서 반환한 문자열 출력
  2. gcd 최대공약수 구하는 함수 선언
  3. solution 최대공약수를 이용해 최소공배수를 구하고 문자열을 출력하는 함수선언
    1. result빈배열 생성
    2. gcd함수에서 구한 최대공약수를 배열의 첫번째에 추가
    3. 최소공배수를 구해 배열의 두번째에 추가
    4. 문자열 변수 answer에 최대공약수, 최소공배수를 출력하는 내용 담기
    5. 두 수가 서로소인 경우, 각각의 리턴값 만들기
  4. input함수 재시작

 

 

코드정리

//
//  main.swift
//  calGcdAndLcm
//
//  Created by bang_hyeonseok on 2021/12/16.
//
import Foundation

// MARK: - input함수 선언
func input(){
    print("두 개의 숫자를 입력하세요. ex)24 18" )
    let inputNum = readLine()
    if let inputNum = inputNum{
        // 구분자 설정
        let stringArray = inputNum.components(separatedBy: [" ","/",",","-","."])
        //        print(stringArray)
        // 입력값이 없는경우, 띄어쓰기 잘 못한 경우 오류처리
        if stringArray.count != 2 {
            print("양식의 길이에 맞지않습니다. 두 개의 숫자만 입력해주세요")
            input()
            // 성공
        } else {
            // 숫자로 입력하지 않을 경우 오류처리
            let firstNum: Int? = Int(stringArray[0])
            guard let _ = firstNum else {
                print("앞자리를 숫자로 입력하세요")
                return input()
            }
            let secondNum: Int? = Int(stringArray[1])
            guard let _ = secondNum else {
                print("뒷자리를 숫자로 입력하세요")
                return input()
            }
            //문자형 배열을 숫자형 배열로 변환
            //다른 타입에 오류처리했기때문에 강제 추출
            let numArray = stringArray.map {
                Int(String($0))!
            }
            print(solution(numArray[0], numArray[1]))
            input()
        }
    }
}
input()


// MARK: - 최대공약수를 구하는 함수
/**
 - parameters:
 - a: 앞 숫자
 - b: 뒷 숫자
 */

func gcd(_ a: Int, _ b: Int) -> Int {
    // r: 나머지
    let r = a % b
    if r == 0 {
        return min(a,b)
    } else {
        return gcd(b,r)
    }
    //    return 0 == r ? min(a,b) : gcd(b,r)
}


// MARK: - 최대공약수를 이용해 최대공약수와 최소공배수를 출력하는 함수
/**
 - parameters:
 - n: 앞 숫자
 - m: 뒷 숫자
 */
func solution(_ n:Int, _ m: Int) -> String {
    //초기값
    var result: Array<Int> = []
    var answer: String = "최대공약수와 최소공배수"
    //최대공약수를 result배열의 첫번째에 추가
    result.append(gcd(n, m))
    //최고공배수를 구하는 결과값을 result 배열의 두번째에 추가
    result.append(n * m / gcd(n, m))
    //두 수가 서로소인경우 처리
    if (result[0]) == 1 {
        answer = "입력하신 두 숫자는 서로소 입니다. 서로소는 공약수가 1만 존재합니다.\n최대공약수: \(result[0])\n최소공배수: \(result[1])"
        return answer
    } else {
        answer = "최대공약수: \(result[0])\n최소공배수: \(result[1])"
        return answer
    }
}
반응형