[분할정복 + 재귀] 백준 실버1 1629번: 곱셈(Swift)

2023. 5. 22. 13:10·코테

https://www.acmicpc.net/problem/1629

 

1629번: 곱셈

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

www.acmicpc.net

Code
let ABC = readLine()!.split(separator: " ").map { Int($0)! }

let A = ABC[0]
let B = ABC[1]
let C = ABC[2]

func recursion(N: Int) -> Int {
  if N == 0 { return 1 }
  
  if N % 2 == 0 {
    let r = recursion(N: N/2)
    return r % C * r % C
  } else {
    let r = recursion(N: (N - 1)/2)
    return r % C * r % C * A % C
  }
}

print(recursion(N: B))
풀이과정

해당 문제는 A의B승을 C로 나눈 나머지를 구하는 문제이다.

나머지 같은 경우 [XY % Z == X % Z * Y % Z] 이런식으로 식을 바꿔 풀 수 있다.

즉, [A^B % C == (A^B/2 %C) * (A^B/2 % C)]로 치환하여 풀 수 있다.

이를 재귀를 통해 반복해주면, 밑이 2인 logB의 횟수로 풀 수 있다.

때문에 A, B, C의 최대수인  2,147,483,647여도 32번이면 문제를 해결할 수 있다.

위 문제의 핵심은 A^B % C 해당식을 => (A^B/2 %C) * (A^B/2 % C)로 분할하여 생각할 수 있어야 한다.

저작자표시 (새창열림)

'코테' 카테고리의 다른 글

[DFS] 백준 실버1 11403번: 경로 찾기(Swift)  (0) 2023.05.23
[다이나믹 프로그래밍] 백준 실버3 2579번: 계단 오르기(Swift)  (1) 2023.05.22
[그리디] 백준 실버4 11047번: 동전 0(Swift)  (0) 2023.05.19
[이분 탐색] 백준 실버3 2512번: 예산(Swift)  (0) 2023.05.18
[완전 탐색] 백준 브론즈1 10448번: 유레카 이론(Swift)  (0) 2023.05.18
'코테' 카테고리의 다른 글
  • [DFS] 백준 실버1 11403번: 경로 찾기(Swift)
  • [다이나믹 프로그래밍] 백준 실버3 2579번: 계단 오르기(Swift)
  • [그리디] 백준 실버4 11047번: 동전 0(Swift)
  • [이분 탐색] 백준 실버3 2512번: 예산(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    Swift
    완전탐색
    photos
    챌린지
    photoUI
    ios
    비동기
    GCD
    회고
    동시성
    노드
    그리디
    BFS
    코딩테스트
    실버
    구현
    브루트포스 알고리즘
    코테
    알고리즘
    이분탐색
    탐색
    재귀
    dfs
    네부캠
    다이나믹 프로그래밍
    백준
    PhotoKit
    Race Condition
    Property wrapper
    Combine
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[분할정복 + 재귀] 백준 실버1 1629번: 곱셈(Swift)
상단으로

티스토리툴바