Go Lang/Algorithm

[GoLang] ๋ฐฑ์ค€ 1019๋ฒˆ, ์ฑ… ํŽ˜์ด์ง€

DSeung 2024. 2. 22. 23:22

๐Ÿ” ๋ฌธ์ œ ํ†บ์•„๋ณด๊ธฐ

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

1,000,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ N์ด ์ฃผ์–ด์งˆ ๋•Œ 
1 ~ N๊นŒ์ง€์˜ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์—์„œ 0~9๊ฐ€ ๋ช‡ ๋ฒˆ ๋‚˜์˜ค๋Š”์ง€ ๊ตฌํ•ด๋ณด์ž

 

๋ฐฑ์ค€์—์„œ๋Š” 1์ดˆ๋‹น 1์–ต์„ ๋„˜์–ด๊ฐ€๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” 10์–ต์ด๊ธฐ์— ๋‹น์—ฐํžˆ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”๊ทœ์น™ ์ฐพ๊ธฐ

์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•จ์€ ๊ณง ๊ทœ์น™์ด ์žˆ๊ณ  ์ด๊ฑฐ๋ฅผ ์ฐพ์œผ๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ฃ 

์ € 10์–ต ์ž๋ฆฌ์˜ ์ˆ˜๋ฅผ ๋ฌด์–ธ๊ฐ€ ํ•˜๋ ค๋ฉด ์ˆ˜๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ ๋ฌธ์ž์—ด๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

 

๋‹ค๊ฐ€๊ฐ€๊ธฐ 1

์ผ๋‹จ 1๋ถ€ํ„ฐ 99๋Š” ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๐Ÿ’ก์–ด๋”” ๋ณด์ž ์‹ญ์˜ ์ž๋ฆฌ๋งŒ ๋‘๊ณ  ์ƒ๊ฐํ•˜๋ฉด 1~9๊ฐ€ 10๋ฒˆ ๋ฐ˜๋ณต๋˜๊ณ  (๊ฐ ์‹ญ์˜ ์ž๋ฆฟ์ˆ˜๋Š” ์ผ์ž๋ฆฌ๊ฐ€ 9๊นŒ์ง€ ๋Œ๊ธฐ ๋•Œ๋ฌธ์—)

์ผ์˜ ์ž๋ฆฌ๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋‹ˆ๊น 0์€ 9๋ฒˆ ๋‚˜๋จธ์ง€๊ฐ€ 10๋ฒˆ ๋ฐ˜๋ณต๋˜๋„ค

 

๋‹ค๊ฐ€๊ฐ€๊ธฐ 2

1 ~ 99๋Š” ์‰ฌ์šด๋ฐ ๊ทธ๋Ÿฌ๋ฉด 1 ~ 56์€? ์ค‘๊ฐ„๊นŒ์ง€๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ•˜์ง€?

๐Ÿ’ก ์ด๋ฒˆ์—” ์‹ญ์˜ ์ž๋ฆฌ๋Š” ์ตœ๋Œ€ ์ˆซ์ž๋ฅผ 99๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์‹ญ์˜์ž๋ฆฌ๋ผ๋ฆฌ์˜ ์ฐจ์ธ 9 - 5 +1 = 5๋งŒํผ์€ 10๋ฒˆ์”ฉ ๋ฐ˜๋ณต๋˜์ง€๋งŒ

5์˜ ๊ฒฝ์šฐ 6๊นŒ์ง€๋งŒ ๋ฐ˜๋ณต๋˜๋„ค ๊ทธ๋Ÿฌ๋ฉด 9-6์„ ํ•œ 3์„ ๋นผ์•ผ์ง€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ’์ด ๋‚˜์˜ค๊ฒ ์–ด

 

์ผ์˜ ์ž๋ฆฌ๋Š” 50/10์œผ๋กœ ์‹ญ์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ 10์œผ๋กœ ๋‚˜๋ˆˆ ํ›„ + 1์„ ํ•œ ๊ฐ’๋งŒํผ 0~9๊ฐ€ ๋ฐ˜๋ณต๋˜๋„ค

ํ•˜์ง€๋งŒ 0์€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์กฐ๊ฑด ๋•Œ๋ฌธ์— 1์„ ๋นผ๊ณ  7,8,9๋„ ์ผ์˜ ์ž๋ฆฟ ์ˆ˜๊ฐ€ 6์ด๋‹ˆ ํ•˜๋‚˜์”ฉ ๋ฐ˜๋ณต๋˜๋Š” ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์•ผ๊ฒ ๋„ค

 

๋‹ค๊ฐ€๊ฐ€๊ธฐ 3

์‹ญ์˜ ์ž๋ฆฌ๊นŒ์ง€ ๊ตฌํ–ˆ๋‹ค๋ฉด ์ด๋ฅผ ๋ฐฑ์˜ ์ž๋ฆฌ ์ด์ƒ์˜ ์ˆ˜๋„ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งจ ์™ผ์ชฝ ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹ญ์˜ ์ž๋ฆฟ์ˆ˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฑฐ์ฃ 

๋Œ€์‹  ์•„๋ž˜ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ€์žฅ ์™ผ์ชฝ ์ˆ˜ ๊ฐ’์ด 9์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ฐจ๊ฐ๋˜๋Š” ๋กœ์ง์„ ์‹ญ์˜ ์ž๋ฆฟ์ˆ˜ ์ด์ƒ์—๋„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  • ๊ฐ€์žฅ ์™ผ์ชฝ ์ˆ˜๋ฅผ ๋ฒ„๋ฆฌ๋ฉด์„œ ์ž๋ฆฟ์ˆ˜๋งŒํผ์˜ ๊ณฑ์…ˆ์„ ํ•ด์ค„ ๋กœ์ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜ ํ”„๋กœ์„ธ์Šค๋Œ€๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค

  1. ์ˆซ์ž์˜ ๊ธธ์ด๋งŒํผ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ 
  2. ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์ˆ˜๋ฅผ ์ผ์˜ ์ž๋ฆฌ๋กœ ๊ฐ€์ •ํ•˜๊ณ  ์ด๋ฅผ 9๋กœ ๋งŒ๋“  ํ›„ ์ด์— ๋Œ€ํ•œ ์ฐจ๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค
  3. ์ผ๋‹จ ์ผ์˜ ์ž๋ฆฟ ์ˆ˜๊ฐ€ ์ตœ๋Œ€๋กœ ๋‚˜์˜ค๋Š” ์ˆ˜๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค (ex : 543์ด๋ฉด 54+1๋กœ ์ €์žฅํ•˜๊ธฐ)
  4. ์ผ์˜ ์ž๋ฆฟ์ˆ˜๊ฐ€ 2๋ฒˆ์—์„œ ๊ตฌํ•œ ์ฐจ๋ณด๋‹ค ๋” ๋‚˜์˜จ ๊ฐ’์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค
  5. ์ผ์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ˆ˜์—์„œ๋„ ์ถ”๊ฐ€๋กœ ๋‚˜์˜จ ๊ฐ’์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค 
  6. 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ 0์„ ๋บ๋‹ˆ๋‹ค (์‹ญ์˜ ์ž๋ฆฟ์ˆ˜, ๋ฐฑ์˜ ์ž๋ฆฟ์ˆ˜๋„ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๊ฐ ์ž๋ฆฟ์ˆ˜๋„ ๋บ๋‹ˆ๋‹ค)
  7. ๋ฐ˜๋ณต๋ฌธ์ด ์ง„ํ–‰๋ ์ˆ˜๋ก page ๊ฐ’๊ณผ weight (์ž๋ฆฟ์ˆ˜) ๊ฐ’์„ ์ˆ˜์ •ํ•ด์„œ ์™ผ์ชฝ ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ž๋ฆฟ์ˆ˜๋ฅผ ๋Š˜๋ ค ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ” ์ฝ”๋“œ ์งœ๋ณด๊ธฐ

๊ณ„์‚ฐ ์ƒ ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ผ์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ 9๋กœ ๊ฐ€์ •ํ•œ ํ›„ ์ตœ๋Œ€ ๊ฐ’์„ ์ €์žฅํ•œ ํ›„ 

์ดˆ๊ณผํ•œ ์ž๋ฆฟ์ˆ˜๋Š” ๋นผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

package main

import (
	"fmt"
	"strconv"
)

func main() {
	var page int
	var page_count int
	counts := make([]int, 10)
	weight := 1

	fmt.Scanln(&page)

	// ์ž…๋ ฅ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”์„œ ์ž๋ฆฟ์ˆ˜ ๋งŒํผ ๋ฐ˜๋ณตํ•˜๊ฒŒ ์ˆ˜์ •
	page_count = len(strconv.Itoa(page))

	for i := 0; i < page_count; i++ {
		// ํ˜„์žฌ page ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ 1์˜ ์ž๋ฆฌ์ˆ˜๋ฅผ 9๋กœ ๋งŒ๋“ค๊ณ 
		var replaced, _ = strconv.Atoi(strconv.Itoa(page/10) + "9")
		// ์ฐจ๋ฅผ ๊ตฌํ•จ
		var remaining = replaced - page

		// ์ผ์˜ ์ž๋ฆฌ์ˆ˜ 0~9๊ฐ€ ๋‚˜์˜ค๋Š” ์ตœ๋Œ€ ๋ฐ˜๋ณต ํšŒ์ˆ˜ ์ €์žฅ
		for index, _ := range counts {
			counts[index] += (replaced/10 + 1) * weight
		}

		// ์ผ์˜ ์ž๋ฆฌ์ˆ˜์˜ ๋ฐ˜๋ณต์ˆ˜๊ฐ€ ์ดˆ๊ณผ๋œ ๋งŒํผ ๋นผ๊ธฐ
		for i := 10 - remaining; i < 10; i++ {
			counts[i] -= weight
		}

		// ์ผ์˜ ์ž๋ฆฌ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ž๋ฆฟ์ˆ˜์—์„œ ์ผ์˜ ์ž๋ฆฟ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต๋˜์ง€
		// ์•Š์•„์„œ ์ƒ๊ธฐ๋Š” ์ˆ˜ ๋งŒํผ ๋บด๊ธฐ
		strNum := strconv.Itoa(page)[:len(strconv.Itoa(page))-1]
		for _, value := range strNum {
			counts[int(value-'0')] -= weight * remaining
		}

		// ์ˆ˜๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ
		// 0์ด ์ž๋ฆฟ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Œ (์‹ญ์˜ ์ž๋ฆฌ, ๋ฐฑ์˜ ์ž๋ฆฌ ์ด์ƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)
		counts[0] -= weight

		// ํŽ˜์ด์ง€๋ฅผ ์ค„์ด๊ณ 
		page /= 10
		// ์ž๋ฆฟ์ˆ˜๋ฅผ ์ฆ๊ฐ€ ์‹œํ‚ด
		weight *= 10
	}

	for index, count := range counts {
		if index == len(counts)-1 {
			fmt.Printf("%d", count)
			break
		}
		fmt.Printf("%d ", count)
	}
}

 

 

๋ฐ˜์‘ํ˜•