๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Coding Test/๋ฐฑ์ค€(BOJ)

[BOJ] ๋ฐฑ์ค€ #2078. ๋ฌดํ•œ์ด์ง„ํŠธ๋ฆฌ (C++)

๐ŸŽจ ๋ฌธ์ œ

๋ฌธ์ œ ๋งํฌ: https://www.acmicpc.net/problem/2078

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜: ์ˆ˜ํ•™, ํŠธ๋ฆฌ
  • ๋‚œ์ด๋„: Silver 4

 

๐Ÿ’ฌ ํ’€์ด

๋ฌธ์ œ์˜ ๋ฌดํ•œ์ด์ง„ํŠธ๋ฆฌ์˜ ์–ด๋–ค ๋…ธ๋“œ (a,b)์—์„œ
if a>b์ด๋ฉด, (a,b)๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹์ด๊ณ ,
if a<b์ด๋ฉด, (a,b)๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด๋‹ค.

๋”ฐ๋ผ์„œ
if a>b์ด๋ฉด, (a,b)์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋Š” (a-b, b)์ด๊ณ ,
if a<b์ด๋ฉด, (a,b)์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ (a, b-a)์ด๋‹ค.



๊ทผ๋ฐ ์ž…๋ ฅ๊ฐ’ A,B๊ฐ€ ์ตœ๋Œ€ 20์–ต๊นŒ์ง€๋ผ๋‹ˆ..ใ…‹ใ…‹์Œ

์ฒ˜์Œ์— ์ƒ๊ฐํ–ˆ๋˜ ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํžˆ ์ž…๋ ฅ ๋…ธ๋“œ์—์„œ๋ถ€ํ„ฐ ๊ทœ์น™์— ๋”ฐ๋ผ์„œ ๋ฃจํŠธ ๋…ธ๋“œ๊นŒ์ง€ ๋”ฐ๋ผ ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ํ’€์—ˆ์„ ๋• ์—ญ์‹œ๋‚˜ '์‹œ๊ฐ„ ์ดˆ๊ณผ'. ๐Ÿ‘‰๐Ÿปํ‹€๋ฆฐ ์ฝ”๋“œ ํ™•์ธ

Why?

์ถœ์ฒ˜) https://www.youtube.com/watch?v=IKnjzmyk70U

์ด์ง„ํŠธ๋ฆฌ์—์„œ ์‚ฝ์ž…,๊ฒ€์ƒ‰,์‚ญ์ œ ๋“ฑ์˜ ์—ฐ์‚ฐ์€ ๋ชจ๋‘ ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ์–ผ๋งˆ์ธ์ง€์— ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ •ํ•ด์ง„๋‹ค.

์—ฌ๊ธฐ์„œ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํŠธ๋ฆฌ๊ฐ€ ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ ๋ชจ์–‘์˜ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค๋ฉด (ex. A=20์–ต, B=1) ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์ด๋‹ค.

 


 

์–ด์จŒ๋“  ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ํ’€์ด๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด์•ผ ํ–ˆ๋Š”๋ฐ, ๋„์ €ํžˆ ์•ˆ ๋– ์˜ฌ๋ผ์„œ ๊ฒฐ๊ตญ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ดค๊ณ , ํ’€์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋งŒ์•ฝ (a,b)์—์„œ ๊ณ„์† ์™ผ์ชฝ ์ž์‹์œผ๋กœ k๋ฒˆ ์ด๋™ํ•˜๋ฉด, a์— b๋ฅผ k๋ฒˆ ๋”ํ•˜๊ฒŒ ๋˜๊ณ ,

๋งŒ์•ฝ (a,b)์—์„œ ๊ณ„์† ์˜ค๋ฅธ์ชฝ ์ž์‹์œผ๋กœ k๋ฒˆ ์ด๋™ํ•˜๋ฉด, b์— a๋ฅผ k๋ฒˆ ๋”ํ•˜๊ฒŒ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด (1,2) -> (3,2) -> (5,2)=(1+2*2, 2)๋‹ค.

 

๋”ฐ๋ผ์„œ ์ž์‹(a,b)์—์„œ ๋ชซ a/b๊ณผ ๋‚˜๋จธ์ง€ a%b ๋“ฑ์˜ ์ •๋ณด๋กœ '๊ณ„์† ๊ฐ™์€ ๋ฐฉํ–ฅ์ธ ๋ถ€๋ชจ'๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ’ก

 

์ฐธ๊ณ ) https://lastknight00.tistory.com/121

 

 

๐Ÿ‘ฉ‍๐Ÿ’ป ์ฝ”๋“œ

C++

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	//freopen("input.txt", "rt", stdin);
	int A, B;
	cin >> A >> B;
	int L = 0, R = 0;
	while (!(A == 1 && B == 1)) {
		/* A,B ์ค‘ ํ•˜๋‚˜๊ฐ€ 1์ธ ๊ฒฝ์šฐ๋Š” ๋”ฐ๋กœ ์ฒ˜๋ฆฌ */
		if (A == 1) {
			R += B - 1;
			break;
		}
		else if (B == 1) {
			L += A - 1;
			break;
		}

		/* ์—ฐ์†์œผ๋กœ ๊ฐ™์€ ๋ฐฉํ–ฅ ๋ถ€๋ชจ-์ž์‹์€ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌ */
		if (A > B) {
			L += A / B;
			A = A % B;
		}
		else {
			R += B / A;
			B = B % A;
		}
	}

	cout << L << ' ' << R;

	return 0;
}