μ€λμ νμ€νΈλ μ λ Ήμ ν©λ¬΄μ§μ λλ€. λνλ₯Ό νκ³ λ¬΄μΈλλ₯Ό κ°λ‘μ§λ₯΄κ³ μμ΅λλ€. λνμ κ°λ°©μμ μ§λλ₯Ό λ°κ²¬νμ΅λλ€. μ§λμλ μ¬λ§μ ν΅κ³Όνλ λ°©λ²μ λν μ§μΉ¨κ³Ό 맀λμ΄ μ¬λ¬ κ° μμ΅λλ€. μ§λλ λ€μκ³Ό κ°μ΄ 보μ λλ€.
RL
AAA = (BBB, CCC)
BBB = (DDD, EEE)
CCC = (ZZZ, GGG)
DDD = (DDD, DDD)
EEE = (EEE, EEE)
GGG = (GGG, GGG)
ZZZ = (ZZZ, ZZZ)
λ
Έλ AAA
μμ μμνμ¬ λ
Έλ ZZZZ
μ λλ¬ν΄μΌ ν©λλ€. κ·Έλ¦¬κ³ λ
Έλ ZZZ
μ λλ¬νλ λ° λͺ λ¨κ³κ° νμνμ§ μμμΌ ν©λλ€.
ννΈ 1#
맡μ λ°°μ΄λ‘ ꡬ문 λΆμνλ κ²μ μ¬μ μ΅λλ€.
$map = array_slice($map, 1);
$map = array_map(function ($value) {
Β Β [$point, $lr] = explode(' = ', str_replace(['(', ')'], '', str_replace(['(', ')'], '', $value)));
Β Β [$L, $R] = explode(', ', $lr);
Β Β return compact('point', 'L', 'R');
}, $map);
κ²°κ΅ μ§λλ₯Ό κ°μ§κ³ μμμ΄
[
point => AAA,
L => XXX,
R =? BBB,
]
μ΄μ λ΄κ° ν΄μΌ ν μΌμ λͺ¨λ μ§μΉ¨μ μ΄ν΄λ³΄κ³ μΌμͺ½μΌλ‘ κ°μΌ νλμ§ μ€λ₯Έμͺ½μΌλ‘ κ°μΌ νλμ§ νμΈνλ κ²λΏμ΄μμ΅λλ€.
while ($currentPoint != 'ZZZ') {
Β Β $currentPoint = move($currentPoint, $map, $leftRight[$i]);
Β Β $i++;
Β Β if ($i >= strlen($leftRight) ) {
Β Β Β Β $i = 0;
Β Β }
Β Β $steps++;
}
μ§λ κ°μ΄λμλ μ΄λ μͺ½μ μ νν΄μΌ νλμ§ μλ΄κ° λκΉμ§ κ°λ©΄ μ²μλΆν° λκΉμ§ λ°λ³΅ν΄μΌ νλ€κ³ λμ μμ΅λλ€. μ΄λ₯Ό 보μ₯νκΈ° μν΄ μ§μΉ¨μ΄ λλλ©΄ μΉ΄μ΄ν°λ₯Ό μ¬μ€μ νκΈ°λ§ νλ©΄ λ©λλ€.
if ($i >= strlen($leftRight) ) {
$i = 0;
}
λ€μ μ§μ μ μ°ΎμΌλ €λ©΄ array_search
λ₯Ό μ¬μ©ν©λλ€.
function move($startpoint, $map, $leftRight)
{
Β Β $point = array_search($startpoint, array_column($map, 'point'));
Β Β return $map[$point][$leftRight];
}
μ΄ λΆλΆμ λΉκ΅μ μ¬μ΄ λΆλΆμ΄μμ΅λλ€. μ μ΄λ 3μΌμ°¨λ³΄λ€λ μ¬μ κ³ μ루μ μ λ§μ‘±ν©λλ€.
ννΈ 2#
μ΄κ²μ (νμ κ·Έλ λ―) 첫 λ²μ§Έ κ²λ³΄λ€ λ μ΄λ €μ μ΅λλ€. μ΄μ μ¬λ¬ κ²½λ‘λ₯Ό λ°λΌμΌ ν©λλ€. μμ λ
Έλλ λ§μ§λ§ λ¬Έμκ° A
μΈ λ
Έλμ΄κ³ λ§μ°¬κ°μ§λ‘ λμ λ
Έλμ λ§μ§λ§ λ¬Έμλ Z
μ
λλ€. μμ λ
Έλμ λ λ
Έλμ λ²νΈλ κ°μ΅λλ€. μ μ€μ λ°λ₯΄λ©΄ μ§λλ μΈκ°μ μν΄ λ§λ€μ΄μ§ κ²μ΄ μλλΌ μ λ Ήμ μν΄ λ§λ€μ΄μ§ κ²μΌ μλ μμ΅λλ€. 무μλ€ π»
λ²μ 1#
To find all start nodes I used following function
$startPoints = array_values(array_map(function ($value) {
Β Β return $value;
}, array_filter($map, function ($value) {
Β Β return substr($value['point'], -1) == 'A';
})));
λ
Έλλ₯Ό ν΅κ³ΌνκΈ° μν΄ ννΈ 1μμμ μ μ¬ν while
루νλ₯Ό μ¬μ©νμ§λ§, λ°λΌμΌ νλ κ° λ
Έλ(μμμλΆν°)λ₯Ό ν΅κ³ΌνκΈ° μν΄ λ€λ₯Έ μ¬μ΄ν΄μ μΆκ°νμ΅λλ€.
while(!isEverythingAtEnd($currentPoints, $startPointsCount)) {
Β Β foreach ($currentPoints as &$point) {
Β Β Β Β $point = move($point[$leftRight[$i]], $map);
Β Β Β Β array_values($currentPoints);
Β Β } Β Β
Β $i++;
Β Β if ($i >= strlen($leftRight) ) {
Β Β Β Β $i = 0;
Β Β } Β Β
Β Β $steps ++;
}
λν λ
Έλ μ΄λ¦λ§ λ°ννλ κ²μ΄ μλλΌ μ 체 μ§μ (λ
Έλ)μ λ°ννλλ‘ move
ν¨μλ₯Ό μ
λ°μ΄νΈνμ΅λλ€.
function move($to, $map)
{
Β Β $point = array_search($to, array_column($map, 'point'));
Β Β return $map[$point];
}
λͺ©μ μ§μ λμ°©νλμ§ νμΈνκΈ° μν΄ (λ΄κ° μλ λ
Έλμμ) λ§μ§λ§ κΈμκ° ZμΈ λ
Έλκ° λͺ κ° μλμ§ νμΈν©λλ€. μ€λͺ
μμ A
κ° μλ λ
Έλμ κ°μ μλΌλ κ²μ μ μ μμ΅λλ€. λ°λΌμ κ²°κ΅ A
μ Z
κ° λͺ¨λ κ°μ μμ¬μΌ ν©λλ€.
function isEverythingAtEnd($currentPoints, $startPointsCount) {
Β Β $atTheEnd = array_filter($currentPoints, function ($value) {
Β Β Β Β return substr($value['point'], -1) == 'Z';
Β Β });
Β Β if (count($atTheEnd) == $startPointsCount) {
Β Β Β Β return true;
Β Β }
Β Β return false;
}
κ·Έκ² λ€μ λλ€. μ΄ μ루μ μ λ§μ μμ λ°μ΄ν°μμλ μλνμ§ μμ΅λλ€. (λͺ λΆ λμ μ¬λ¬ λ¨κ³λ₯Ό κ±°μ³λ μμ§ λκΉμ§ λλ¬νμ§ λͺ»νμ΅λλ€).
λ²μ 2#
λ€μμΌλ‘ μκ°ν κ²μ νΈλ¦¬μ λμ΄ μ°μ κ²μ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μ²μλΆν° λκΉμ§ κ²½λ‘λ₯Ό μ°Ύλ κ²μ΄μμ΅λλ€. κ·Έλμ λ€μκ³Ό κ°μ΄ νΈλ¦¬ ꡬ쑰λ₯Ό λ§λ€μμ΅λλ€.
$tree = [];
foreach ($map as $value) {
Β Β $tree[$value['point']] = [
Β Β Β Β 'L' => $value['L'],
Β Β Β Β 'R' => $value['R'],
Β Β ];
}
λ€μμΌλ‘, μμ λ Έλμ λͺ©μ μ§ λ Έλλ₯Ό λͺ¨λ μ°Ύμμ΅λλ€.
$startNodes = array_filter(array_keys($tree), function($node) { return substr($node, -1) == 'A'; });
$endNodes = array_filter(array_keys($tree), function($node) { return substr($node, -1) == 'Z'; });
λͺ¨λ κ²½λ‘λ₯Ό λμ΄νκ³ μ½λλ‘ κ±Έμ μλ₯Ό κ³μ°νμΈμ.
$pathSizes = [];
foreach ($startNodes as $start) {
Β Β foreach ($endNodes as $end) {
Β Β Β Β $path = bfs($start, $end, $tree);
Β Β Β Β if ($path !== null) {
Β Β Β Β Β Β $pathSizes[] = count($path) - 1;
Β Β Β Β Β Β echo "Path from $start to $end: " . implode(' -> ', $path) . "\n";
Β Β Β Β }
Β Β }
}
λ€μκ³Ό κ°μ κ°μ λ°νν©λλ€.
(κ° κ²½λ‘μ 첫 λ²μ§Έλ μμ λ
Έλ κ²½λ‘λΉ κ³΅λ λ¨κ³λ μμ μ -1
)
Path from 11A to 11Z: 11A -> 11B -> 11Z
Path from 22A to 22Z: 22A -> 22B -> 22C -> 22Z
Steps per path: [2, 3]
LCM: 6
μ λ μνμ λ₯μνμ§ μμ§λ§ λͺ¨λ κ²½λ‘κ° κ°μ μ§μ μμ λλλ μμ μ κ³μ°νλ λ°©λ²μ AIμκ² λ¬Όμ΄λ΄€μ΅λλ€. κ·Έλ¬μ LCM λ°©λ²μ μ¬μ©ν κ²μ μΆμ²νμ΅λλ€. μ΄ λ°©λ²μ ν μ€νΈ μ λ ₯κ³Ό κ°μΈνλ μ λ ₯μ λν΄ μκ° κ°κ²©μ λκ³ μλνμ§λ§, LCMμ μ΄μ λν ν΄λ΅μ΄ μλ κ² κ°μ΅λλ€.
λ΄ μ루μ
μ λ¬Έμ μ μ λͺ¨λ λ
Έλκ° λμΌν μμ λ¨κ³μ μλ λ
Έλλ₯Ό κ³ λ €νμ§ μλλ€λ κ²μ
λλ€. λͺ¨λ λ
Έλμ λ§μ§λ§ κΈμκ° Z
μΈμ§ μ¬λΆλ κ³ λ €νμ§ μμ΅λλ€. λλ λ¨μ§ λ
Έλκ° κ°μ κΈΈμ΄μμλ 첫 λ²μ§Έ μ₯μλ₯Ό μ°Ύκ³ κ·Έκ² λ€μ
λλ€.
μλ§λ μμ v1 μ½λλ μ νν μ«μμ λλ¬ ν μ μμ§λ§ ν¨μ¬ λ λΉ λ₯Έ μ»΄ν¨ν° λ ν¨μ¬ λ λ§μ μκ°μ΄ νμν κ²μ λλ€. λλ λ€λ₯Έ ν΄κ²°μ± .
λ΄ μμ€ μ½λλ λ€μμμ μ¬μ©ν μ μμ΅λλ€. GitHub.
Reply by Email