Hello Ocean! 🌼

[λ°±μ€€/C++] 12888. μ™„μ „ 이진 트리 λ„λ‘œ λ„€νŠΈμ›Œν¬ λ³Έλ¬Έ

Algorithm

[λ°±μ€€/C++] 12888. μ™„μ „ 이진 트리 λ„λ‘œ λ„€νŠΈμ›Œν¬

bba_dda 2021. 7. 20. 21:44
λ°˜μ‘ν˜•

문제

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

BOJ λ‚˜λΌλŠ” λ„μ‹œμ™€ 두 λ„μ‹œλ₯Ό μ—°κ²°ν•˜λŠ” λ„λ‘œλ‘œ 이루어져 μžˆλ‹€. 이 λ‚˜λΌμ˜ λ„λ‘œ λ„€νŠΈμ›Œν¬λŠ” μ™„μ „ μ΄μ§„ 트리의 ν˜•νƒœλ₯Ό 가진닀.

μˆ˜λΉˆμ΄λŠ” BOJ λ‚˜λΌμ˜ λ„λ‘œ λ„€νŠΈμ›Œν¬ 트리의 높이 Hλ₯Ό μ•Œκ³  μžˆλ‹€. 트리의 높이λ₯Ό μ•ˆλ‹€λ©΄, λ„μ‹œμ˜ κ°œμˆ˜μ™€ λ„λ‘œμ˜ κ°œμˆ˜λ„ ꡬ할 수 μžˆλ‹€. 트리의 높이가 H인 κ²½μš°μ— λ„μ‹œμ˜ κ°œμˆ˜λŠ” 2(H+1)-1개 이고, λ„λ‘œμ˜ κ°œμˆ˜λŠ” 2(H+1)-2κ°œκ°€ λœλ‹€.

μ•„λž˜ 그림은 H = 2일 λ•Œ, 그림이닀.

μˆ˜λΉˆμ΄λŠ” λ„λ‘œ λ„€νŠΈμ›Œν¬μ— μ°¨λ₯Ό 보내렀고 ν•œλ‹€. λͺ¨λ“  μ°¨λŠ” μ‹œμž‘ λ„μ‹œμ™€ 도착 λ„μ‹œκ°€ 있으며, 같은 λ„μ‹œλ₯Ό 두 번 이상 λ°©λ¬Έν•˜μ§€ μ•ŠλŠ”λ‹€. 차의 μ‹œμž‘ λ„μ‹œμ™€ 도착 λ„μ‹œκ°€ 같을 μˆ˜λ„ μžˆλ‹€.

λͺ¨λ“  λ„μ‹œλ₯Ό λ°©λ¬Έν•œ 차의 κ°œμˆ˜κ°€ λͺ¨λ‘ 1κ°œκ°€ 되기 μœ„ν•΄μ„œ, μˆ˜λΉˆμ΄κ°€ μ°¨λ₯Ό μ΅œμ†Œ λͺ‡ λŒ€λ₯Ό 보내야 ν•˜λŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

풀이

[첫 번째 μ ‘κ·Ό]

곡식을 μ°Ύμ•„μ„œ, λ°”λ‘œ κ³„μ‚°ν•΄μ„œ λ‚΄λ³΄λ‚΄λŠ” λ°©μ‹μœΌλ‘œ ν•΄λ³΄μ•˜λ‹€. 

λͺ‡ 단계λ₯Ό μ μ–΄μ„œ ν™•μΈν•΄λ³΄λ‹ˆ 곡식을 찾을 수 μžˆμ—ˆλ‹€. 

곡식을 μ΄μš©ν•˜λ©΄ O(logN)의 λ³΅μž‘λ„λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆλŠ”λ°, μ œμΆœν•΄λ³΄λ‹ˆ ν‹€λ ΈμŠ΅λ‹ˆλ‹€κ°€ λ‚˜μ™”λ‹€.

곡식에 였λ₯˜κ°€ μžˆμ–΄μ„œ 그런거라고 μƒκ°ν•˜μ§€λ§Œ, ν‹€λ¦° 이유λ₯Ό μ •ν™•νžˆλŠ” λͺ¨λ₯΄κ² λ‹€. 

 

[두 번째 μ‹œλ„] 

DP곡식을 μ°Ύμ•„μ„œ DPλ°©μ‹μœΌλ‘œ ν•΄λ³΄μ•˜λ‹€. 

μ½”λ“œ

#include <iostream>

#define sc scanf_s //μ œμΆœμ‹œμ—” scanf둜 바꿔야함
using namespace std;

long long dp[61];
int main() {
	int H; sc("%d", &H);
	dp[0] = 1; dp[1] = 1;
	for (int i = 2; i <= H; i++) { 
		if (i % 2 == 0) { //짝
			dp[i] = dp[i - 1] * 2 + 1; 
		}
		else { //홀
			dp[i] = dp[i - 1] * 2 - 1;
			
		}
	}
	printf("%lld\n",dp[H]);
}

κ²°κ³Ό

 

λ°˜μ‘ν˜•