๊ทธ๋ ์ด ์ฝ๋ Gray code?
๊ทธ๋ ์ด ์ฝ๋๋ ์ฐ์๋ ์๋ฅผ ํ ๋นํธ๋ง ๋ค๋ฅด๊ฒ ์ธ์ฝ๋ฉ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฆ, ์๊ฐ ์ฆ๊ฐํ ๋, ์ธ์ ๊ฐ 1๊ฐ ๋นํธ๋ง ๋ฐ๋๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์ด์ง | ๊ทธ๋ ์ด | |
0 | 000 | 000 |
1 | 001 | 001 |
2 | 010 | 011 |
3 | 011 | 010 |
4 | 100 | 110 |
5 | 101 | 111 |
6 | 110 | 101 |
7 | 111 | 100 |
๊ทธ๋ ์ด ์ฝ๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฐ์ 1๋นํธ ๊ทธ๋ ์ด ์ฝ๋๋ฅผ ์ด๋ค.
0
1
๊ทธ๋ฆฌ๊ณ ๊ทธ ์๋ ์ญ์์ผ๋ก ๋ค์ 1๋นํธ ๊ทธ๋ ์ด ์ฝ๋๋ฅผ ์ด๋ค.
0
1
1
0
์ ์์ผ๋ก ์ด ๋นํธ ์์๋ 0์, ์ญ์์ผ๋ก ์ด ๋นํธ ์์๋ 1์ ๋ถ์ฌ์ค๋ค.
00
01
11
10
์ด๋ ๊ฒ n๋นํธ ๊ทธ๋ ์ด ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ n+1๋นํธ ๊ทธ๋ ์ด ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
์ฝ๊ฒ ์ ๋ฆฌํ์๋ฉด n๋นํธ ๊ทธ๋ ์ด ์ฝ๋๋ฅผ ์ ๊ณ ์์ 0์ ๋ถ์ธ ๊ฒ๊ณผ, n๋นํธ ๊ทธ๋ ์ด ์ฝ๋๋ฅผ ์ญ์์ผ๋ก ์ ๊ณ ์์ 1์ ๋ถ์ธ ๊ฒ์ ์ด์ผ๋ฉด n+1๋นํธ ๊ทธ๋ ์ด ์ฝ๋๊ฐ ๋๋ค.
์ฝ๋๋ ์์ง ์ดํด ๋ชปํ๊ฒ ๋คใ
#include <stdio.h>
void print_gray_reverse(int code[], int n, int index);
// ๊ทธ๋ ์ด ์ฝ๋ : ์ฐ์๋ ์๋ฅผ ํ ๋นํธ๋ง ๋ค๋ฅด๊ฒ ์ธ์ฝ๋ฉ ํ๋ ๋ฐฉ๋ฒ.
//์ฆ, ๋ค์ ์๋ก ๋์ด๊ฐ ๋ ์ธ์ ๋ 1๊ฐ ๋นํธ๋ง ๋ฐ๋๋ค!!
//n์ ์
๋ ฅ ๋ฐ์์ n๋นํธ ๊ทธ๋ ์ด ์ฝ๋๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ.
void print_code(int code[], int len) {
for (int i = 0; i < len; i++) {
printf("%d", code[i]);
}
printf("\n");
}
void print_gray(int* code, int n, int index) {
if (n == index) { //๋ชฉํ์น์ ๋๋ฌํ๋ฉด ์ฝ๋ ์ถ๋ ฅ
print_code(code, n);
return;
}
//0๋นํธ ์๋ฆฌ ์ ๋ถํฐ ์์!
code[index] = 0;
print_gray(code, n, index + 1);
code[index] = 1;
print_gray_reverse(code, n, index + 1);
}
void print_gray_reverse(int code[], int n, int index) {
if (index == n) {
print_code(code, n);
return;
}
code[index] = 1;
print_gray(code, n, index + 1);
code[index] = 0;
print_gray_reverse(code, n, index + 1);
}
int main(void) {
int code[20], n;
scanf("%d", &n); //n์๋ฆฌ์(๋นํธ)
print_gray(code, n, 0);
}
Reference
https://johngrib.github.io/wiki/gray-code/
๋ฌธ์ ๋ก ํ์ด๋ณด๋ ์๊ณ ๋ฆฌ์ฆ(ํฉ์ธ์ฑ, ๊น์ฉํ)