Go Lang/Algorithm

[GoLang] 백준 7489번 팩토리얼

DSeung 2024. 1. 17. 19:01

개요

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

생각을 잘못해서 몇 번 틀린 문제입니다.

간단하게 팩토리얼 수에서 최우측의 0이 아닌 값을 출력하면 되는 문제인데

 

아 10보다 큰수는 10의 나머지로 계산하면 더 계산이 빨라지겠구나라는 생각을 하여 아래 코드를 넣은 게 실수였습니다.

왜냐하면 25같이 특정 수와 만나면 10의 제곱이 되는 수가 존재하기 때문에 함부로 나머지 연산을 사용하면 안되는 거였죠

if result > 10 {
	result = result % 10
}

 

코드

위와 비슷한 코드가 들어갑니다. 문제에서 언급했듯이 70!은 부동 소수점 변수의 위치까지 넘어가는 매우 큰 수 이므로

이를 처리해야 하는 코드가 필요합니다.

 

그래서 아래 코드를 넣었습니다, 이 코드도 수가 더 커진다면 성립이 안 되겠지만 다행히 이 문제의 입력 범위는 

0 < n < 1001로 주어졌기에 아래와 같은 코드가 성립했습니다.

if result > 1000000 {
	result = result % 1000000
}

 

전체 코드는 아래와 같습니다.

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	var re int

	fmt.Fscanln(reader, &re)

	for re > 0 {
		re--
		var n int
		result := 1
		fmt.Fscanln(reader, &n)

		for i := 1; i <= n; i++ {
			result = getRightFirstNum(result * i)
		}
		fmt.Println(result % 10)

	}

}

func getRightFirstNum(n int) int {
	result := n

	for {
		if result%10 == 0 {
			result = result / 10
		} else if result > 1000000 {
			result = result % 1000000
		} else {
			break
		}
	}

	return result
}
반응형