λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm

[Algorithm] ν‘œ 병합

πŸ“‹ 문제 

당신은 ν‘œ νŽΈμ§‘ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
ν‘œμ˜ ν¬κΈ°λŠ” 50 × 50으둜 κ³ μ •λ˜μ–΄μžˆκ³  μ΄ˆκΈ°μ— λͺ¨λ“  μ…€μ€ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
각 μ…€μ€ λ¬Έμžμ—΄ κ°’을 κ°€μ§ˆ μˆ˜ μžˆκ³ , λ‹€λ₯Έ μ…€κ³Ό λ³‘합될 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ—μ„œ r번째, μ™Όμͺ½μ—μ„œ c번째 μœ„μΉ˜λ₯Ό (r, c)라고 ν‘œν˜„ν•  λ•Œ, λ‹Ήμ‹ μ€ λ‹€μŒ λͺ…령어듀에 λŒ€ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

  1. "UPDATE r c value"
    • (r, c) μœ„μΉ˜μ˜ μ…€μ„ μ„ νƒν•©λ‹ˆλ‹€.
    • μ„ νƒν•œ μ…€μ˜ κ°’을 value둜 λ°”κΏ‰λ‹ˆλ‹€.
  2. "UPDATE value1 value2"
    • value1을 κ°’μœΌλ‘œ κ°€μ§€κ³  μžˆλŠ” λͺ¨λ“  μ…€μ„ μ„ νƒν•©λ‹ˆλ‹€.
    • μ„ νƒν•œ μ…€μ˜ κ°’을 value2둜 λ°”κΏ‰λ‹ˆλ‹€.
  3. "MERGE r1 c1 r2 c2"
    • (r1, c1) μœ„μΉ˜μ˜ μ…€κ³Ό (r2, c2) μœ„μΉ˜μ˜ μ…€μ„ μ„ νƒν•˜μ—¬ λ³‘ν•©ν•©λ‹ˆλ‹€.
    • μ„ νƒν•œ λ‘ μœ„μΉ˜μ˜ μ…€μ΄ κ°™μ€ μ…€μΌ κ²½μš° λ¬΄μ‹œν•©λ‹ˆλ‹€.
    • μ„ νƒν•œ λ‘ μ…€μ€ μ„œλ‘œ μΈμ ‘ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄ κ²½μš° (r1, c1) μœ„μΉ˜μ˜ μ…€κ³Ό (r2, c2) μœ„μΉ˜μ˜ μ…€λ§Œ μ˜ν–₯을 λ°›μœΌλ©°, κ·Έ μ‚¬μ΄μ— μœ„μΉ˜ν•œ μ…€λ“€μ€ μ˜ν–₯을 λ°›μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • 두 μ…€ μ€‘ ν•œ μ…€μ΄ κ°’을 κ°€μ§€κ³  μžˆμ„ κ²½μš° λ³‘ν•©λœ μ…€μ€ κ·Έ κ°’을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.
    • 두 μ…€ λͺ¨λ‘ κ°’을 κ°€μ§€κ³  μžˆμ„ κ²½μš° λ³‘ν•©λœ μ…€μ€ (r1, c1) μœ„μΉ˜μ˜ μ…€ κ°’을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.
    • 이후 (r1, c1) μ™€ (r2, c2) μ€‘ μ–΄λА μœ„μΉ˜λ₯Ό μ„ νƒν•˜μ—¬λ„ λ³‘ν•©λœ μ…€λ‘œ μ ‘κ·Όν•©λ‹ˆλ‹€.
  4. "UNMERGE r c"
    • (r, c) μœ„μΉ˜μ˜ μ…€μ„ μ„ νƒν•˜μ—¬ ν•΄λ‹Ή μ…€μ˜ λͺ¨λ“  λ³‘합을 ν•΄μ œν•©λ‹ˆλ‹€.
    • μ„ νƒν•œ μ…€μ΄ ν¬ν•¨ν•˜κ³  μžˆλ˜ λͺ¨λ“  μ…€μ€ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ΄ˆκΈ°μ˜ μƒνƒœλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.
    • 병합을 ν•΄μ œν•˜κΈ° μ „ μ…€μ΄ κ°’을 κ°€μ§€κ³  μžˆμ—ˆμ„ κ²½μš° (r, c) μœ„μΉ˜μ˜ μ…€μ΄ κ·Έ κ°’을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.
  5. "PRINT r c"
    • (r, c) μœ„μΉ˜μ˜ μ…€μ„ μ„ νƒν•˜μ—¬ μ…€μ˜ κ°’을 μΆœλ ₯ν•©λ‹ˆλ‹€.
    • μ„ νƒν•œ μ…€μ΄ λΉ„μ–΄μžˆμ„ κ²½μš° "EMPTY"λ₯Ό μΆœλ ₯ν•©λ‹ˆλ‹€.

μ•„λž˜λŠ” UPDATE λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ λΉˆ μ…€μ— κ°’을 μž…λ ₯ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

commands 효과
UPDATE 1 1 menu  (1,1)에 "menu" μž…λ ₯
UPDATE 1 2 category (1,2)에 "category" μž…λ ₯
UPDATE 2 1 bibimbap (2,1)에 "bibimbap" μž…λ ₯
UPDATE 2 2 korean (2,2)에 "korean" μž…λ ₯
UPDATE 2 3 rice (2,3)에 "rice" μž…λ ₯
UPDATE 3 1 ramyeon (3,1)에 "ramyeon" μž…λ ₯
UPDATE 3 2 korean (3,2)에 "korean" μž…λ ₯
UPDATE 3 3 noodle (3,3)에 "noodle" μž…λ ₯
UPDATE 3 4 instant (3,4)에 "instant" μž…λ ₯
UPDATE 4 1 pasta (4,1)에 "pasta" μž…λ ₯
UPDATE 4 2 italian (4,2)에 "italian" μž…λ ₯
UPDATE 4 3 noodle (4,3)에 "noodle" μž…λ ₯

μœ„ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™μ€ μƒνƒœκ°€ λ©λ‹ˆλ‹€.

 

μ•„λž˜λŠ” MERGE λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ 셀을 λ³‘ν•©ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

commands 효과
MERGE 1 2 1 3 (1,2)와 (1,3) 병합
MERGE 1 3 1 4  (1,3)κ³Ό (1,4) λ³‘ν•©

μœ„ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ κ°™μ€ μƒνƒœκ°€ λ©λ‹ˆλ‹€.

λ³‘ν•©ν•œ 셀은 "category" 값을 κ°€μ§€κ²Œ 되며 (1,2), (1,3), (1,4) 쀑 μ–΄λŠ μœ„μΉ˜λ₯Ό μ„ νƒν•˜λ”λΌλ„ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” UPDATE λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ μ…€μ˜ κ°’을 λ³€κ²½ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

commands 효과
UPDATE korean hansik "korean"을 "hansik"으둜 λ³€κ²½
UPDATE 1 3 group (1,3) μœ„μΉ˜μ˜ μ…€ 값을 "group"으둜 λ³€κ²½

μœ„ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ κ°™μ€ μƒνƒœκ°€ λ©λ‹ˆλ‹€.

 

μ•„λž˜λŠ” UNMERGE λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ μ…€μ˜ 병합을 ν•΄μ œν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

 

commands 효과
UNMERGE 1 4  μ…€ λ³‘ν•© ν•΄μ œ ν›„ μ›λž˜ κ°’은 (1,4)κ°€ κ°€μ§

μœ„ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ κ°™μ€ μƒνƒœκ°€ λ©λ‹ˆλ‹€.

μ‹€ν–‰ν•  λͺ…령어듀이 λ‹΄κΈ΄ 1차원 λ¬Έμžμ—΄ λ°°μ—΄ commandsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. commands의 λͺ…령어듀을 μˆœμ„œλŒ€λ‘œ μ‹€ν–‰ν•˜μ˜€μ„ λ•Œ, "PRINT r c" λͺ…령어에 λŒ€ν•œ μ‹€ν–‰κ²°κ³Όλ₯Ό μˆœμ„œλŒ€λ‘œ 1차원 λ¬Έμžμ—΄ 배열에 λ‹΄μ•„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

  • 1 ≤ commands의 길이 ≤ 1,000
  • commands의 κ° μ›μ†ŒλŠ” μ•„λž˜ 5κ°€μ§€ ν˜•νƒœ μ€‘ ν•˜λ‚˜μž…λ‹ˆλ‹€.
    1. "UPDATE r c value"
      • r, cλŠ” μ„ νƒν•  μ…€μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λ©°, 1~50 μ‚¬μ΄μ˜ μ •μˆ˜μž…λ‹ˆλ‹€.
      • valueλŠ” μ…€μ— μž…λ ₯ν•  λ‚΄μš©μ„ λ‚˜νƒ€λ‚΄λ©°, μ•ŒνŒŒλ²³ μ†Œλ¬Έμžμ™€ μˆ«μžλ‘œ κ΅¬μ„±λœ κΈΈμ΄ 1~10 μ‚¬μ΄μΈ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
    2. "UPDATE value1 value2"
      • value1은 μ„ νƒν•  μ…€μ˜ κ°’, value2λŠ” μ…€μ— μž…λ ₯ν•  λ‚΄μš©μ„ λ‚˜νƒ€λ‚΄λ©°, μ•ŒνŒŒλ²³ μ†Œλ¬Έμžμ™€ μˆ«μžλ‘œ κ΅¬μ„±λœ κΈΈμ΄ 1~10 μ‚¬μ΄μΈ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
    3. "MERGE r1 c1 r2 c2"
      • r1, c1, r2, c2λŠ” μ„ νƒν•  μ…€μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λ©°, 1~50 μ‚¬μ΄μ˜ μ •μˆ˜μž…λ‹ˆλ‹€.
    4. "UNMERGE r c"
      • r, cλŠ” μ„ νƒν•  μ…€μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λ©°, 1~50 μ‚¬μ΄μ˜ μ •μˆ˜μž…λ‹ˆλ‹€.
    5. "PRINT r c"
      • r, cλŠ” μ„ νƒν•  μ…€μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λ©°, 1~50 μ‚¬μ΄μ˜ μ •μˆ˜μž…λ‹ˆλ‹€.
  • commandsλŠ” 1개 μ΄μƒμ˜ "PRINT r c" λͺ…λ Ήμ–΄λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆ

["UPDATE 1 1 menu", "UPDATE 1 2 category", "UPDATE 2 1 bibimbap", "UPDATE 2 2 korean", "UPDATE 2 3 rice", "UPDATE 3 1 ramyeon", "UPDATE 3 2 korean", "UPDATE 3 3 noodle", "UPDATE 3 4 instant", "UPDATE 4 1 pasta", "UPDATE 4 2 italian", "UPDATE 4 3 noodle", "MERGE 1 2 1 3", "MERGE 1 3 1 4", "UPDATE korean hansik", "UPDATE 1 3 group", "UNMERGE 1 4", "PRINT 1 3", "PRINT 1 4"] ["EMPTY", "group"]
["UPDATE 1 1 a", "UPDATE 1 2 b", "UPDATE 2 1 c", "UPDATE 2 2 d", "MERGE 1 1 1 2", "MERGE 2 2 2 1", "MERGE 2 1 1 1", "PRINT 1 1", "UNMERGE 2 2", "PRINT 1 1"] ["d", "EMPTY"]


✏️ 풀이

셀이 50 x 50으둜 κ³ μ •λ˜μ–΄ 있기 λ•Œλ¬Έμ— 이차원 λ°°μ—΄(cell)을 각각 51길이둜 μ„ μ–Έν–ˆλ‹€. PRINT λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•  λ•Œ λ¬Έμžμ—΄μ˜ falsy값을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ΄ˆκΈ°κ°’μ€ 빈 λ¬Έμžμ—΄μ„ 넣어쀬닀. λͺ…령어에 따라 ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ€¬λ‹€. 

 

병합(MERGE)을 κ³ λ €ν•˜λŠ” 것이 제일 κ³ λ―Όμ΄μ—ˆλŠ”λ° λ³‘ν•©λ¬λŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” mergeCheckλΌλŠ” 이차원 배열을 μ„ μ–Έν•˜κ³  μ΄ˆκΈ°κ°’μœΌλ‘œλŠ” ν˜„μž¬ μžμ‹ μ˜ 인덱슀λ₯Ό 가지도둝 ν–ˆλ‹€. 이 값이 λ§Œμ•½ 자기 μžμ‹ μ˜ μΈλ±μŠ€μ™€ μΌμΉ˜ν•˜λŠ” 값을 κ°€μ§„ κ²½μš°μ—λŠ” 병합이 λ˜μ§€ μ•Šκ±°λ‚˜, λ³‘ν•©λœ 것 쀑 기쀀이 λ˜λŠ” 셀을 κ°€λ₯΄ν‚€λŠ” 경우이고, λ§Œμ•½ λ‹€λ₯΄λ‹€λ©΄ νŠΉμ • μ…€κ³Ό λ³‘ν•©λœ 것이닀. 셀듀이 ν•˜λ‚˜λ‘œ 병합될 λ•Œ λ³‘ν•©λ˜λŠ” λͺ¨λ“  셀은 기쀀이 λ˜λŠ” 셀을 κ°€λ₯΄ν‚€κ²Œ λ˜λŠ”λ° μ΄λŠ” 값을 κ°€μ§€κ³  μžˆλŠ” 셀이 λœλ‹€. λ‚΄κ°€ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•ŒλŠ” MERGE λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•  λ•Œ μ•žμ— μ˜€λŠ” μœ„μΉ˜μ˜ 셀을 κΈ°μ€€μœΌλ‘œ ν–ˆλ‹€. μ˜ˆμ‹œλ₯Ό 보면 μ΄ν•΄ν•˜κΈ° 쉽닀.

 

2x2λ₯Ό κΈ°μ€€μœΌλ‘œ ν•œλ‹€λ©΄ mergeCheck λ°°μ—΄μ˜ μ΄ˆκΈ°κ°’μ€ λ‹€μŒκ³Ό κ°™λ‹€.

[1, 1] [1, 2]
[2, 1] [2, 2]

 

λ§Œμ•½ [1, 1]κ³Ό [1, 2]λ₯Ό λ³‘ν•©ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 ν‘œκΈ°λœλ‹€. μ•žμ— μžˆλŠ” κ°’ [1, 1]의 셀이 기쀀이 λœλ‹€.

[1, 1] [1, 1]
[2, 1] [2, 2]

 

λ³‘ν•©λ˜μ–΄ μžˆλŠ” μ…€κ³Ό ν•©μΉ λ•Œμ—λ„ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. [1, 1]κ³Ό [2, 1]을 λ³‘ν•©ν•˜λ©΄ λ‹€μŒκ³Ό 같이 λœλ‹€.

[1, 1] [1, 1]
[1, 1] [2, 2]

 

μ΄λ•Œ λ³‘ν•©λœ 값듀은 λͺ¨λ‘ ''λ₯Ό 가지도둝 ν•˜κ³ (cell) 기쀀이 λ˜λŠ” μ…€λ§Œ μž…λ ₯된 값을 κ°€μ§„λ‹€.

 

UNMERGE λͺ…λ Ήμ–΄μ˜ 경우 checkMergeκ°’μ—μ„œ 기쀀이 λ˜λŠ” 셀을 μ°ΎλŠ”λ‹€. 기쀀이 λ˜λŠ” 셀에 값을 μž„μ‹œλ‘œ μ €μž₯ν•˜κ³  checkMergeλ₯Ό μˆœνšŒν•˜λ©° 값이 같을 λ•Œ(기쀀이 λ˜λŠ” μ…€κ³Ό 병합이 λ˜μ–΄μžˆμ„ λ•Œ) 자기 μžμ‹ μ˜ μœ„μΉ˜λ₯Ό μ˜λ―Έν•˜λŠ” 인덱슀둜 κ°±μ‹ μ‹œμΌœμ£Όκ³  λͺ¨λ“  값을 ''둜 μ΄ˆκΈ°ν™” ν•΄μ€€ λ‹€μŒμ— UNMERGEλ₯Ό μˆ˜ν–‰ν•˜λŠ” 셀에 μ €μž₯ν•΄λ‘μ—ˆλ˜ 값을 ν• λ‹Ήν•œλ‹€.

 

UPDATE λͺ…령어인 κ²½μš°μ—λŠ” λ‘κ°€μ§€λ‘œ λ‚˜λ‰  수 μžˆλ‹€. 각 λͺ…λ Ήμ–΄λ₯Ό split으둜 λΆ„λ¦¬ν–ˆμ„ λ•Œ 길이에 따라 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ©΄ λœλ‹€. νŠΉμ • μ…€μ˜ μœ„μΉ˜κ°’μ΄ λ“€μ–΄μ˜¨κ²½μš°(r, c, valeκ°€ μ‘΄μž¬ν•  λ•Œ) cellμ—μ„œ ν•΄λ‹Ή μœ„μΉ˜μ˜ 값을 κ°±μ‹ ν•œλ‹€. μ΄λ•Œ λ³‘ν•©λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό κ³ λ €ν•˜μ—¬ mergeCheckμ—μ„œ 기쀀이 λ˜λŠ” 셀을 r, c둜 κ°€μ Έμ™€μ„œ λ³€κ²½ν•œλ‹€. λ§Œμ•½ νŠΉμ • 값을 λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€κ²½ν•˜λŠ” κ²½μš°μ—λŠ”(value1, value2κ°€ μ‘΄μž¬ν•  λ•Œ) ν‘œμ˜ 크기가 크지 μ•ŠκΈ° λ•Œλ¬Έμ— 전체λ₯Ό λŒλ©΄μ„œ νŠΉμ •κ°’μ„ λ³€κ²½ν•  κ°’μœΌλ‘œ λ°”κΏ”μ€€λ‹€.

 

PRINT λͺ…령어인 κ²½μš°μ—λŠ” λ³‘ν•©λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό κ³ λ €ν•˜μ—¬ mergeCheck λ°°μ—΄μ—μ„œ r, cκ°’μœΌλ‘œ 기쀀이 λ˜λŠ” μ…€μ˜ μƒˆλ‘œμš΄ 인덱슀(checkR, checkC)값을 κ°€μ Έμ˜¨λ‹€. μ΄λ•Œ 이 값이 빈 λ¬Έμžμ—΄('')일 λ•ŒλŠ” 'EMPTY'λ₯Ό λ°˜ν™˜ν•˜κ³  μ•„λ‹ˆλΌλ©΄ μžˆλŠ” 값을 λ°˜ν™˜ν•œλ‹€.

 

⌨️ μ½”λ“œ

function solution(commands) {
  var answer = [];

  const cell = [...Array(51)].map(_ => new Array(51).fill(''));
  const mergeCheck = [...Array(51)].map(_ => new Array(51));
  for (let i = 1; i < 51; i++) {
    for (let j = 1; j < 51; j++) {
      mergeCheck[i][j] = [i, j];
    }
  }

  const updateOne = (r, c, value) => {
    const [checkR, checkC] = mergeCheck[r][c];
    cell[checkR][checkC] = value;
  };

  const update = (value1, value2) => {
    for (let i = 1; i < 51; i++) {
      for (let j = 1; j < 51; j++) {
        if (cell[i][j] === value1) cell[i][j] = value2;
      }
    }
  };

  const merge = (r1, c1, r2, c2) => {
    const [checkR1, checkC1] = mergeCheck[r1][c1];
    const [checkR2, checkC2] = mergeCheck[r2][c2];
    const value = cell[checkR1][checkC1] || cell[checkR2][checkC2];

    for (let i = 1; i < 51; i++) {
      for (let j = 1; j < 51; j++) {
        const [checkI, checkJ] = mergeCheck[i][j];
        if (checkI === checkR1 && checkJ === checkC1) mergeCheck[i][j] = [checkR1, checkC1];
        else if (checkI === checkR2 && checkJ === checkC2) mergeCheck[i][j] = [checkR1, checkC1];
        else continue;
        cell[i][j] = '';
      }
    }
    updateOne(checkR1, checkC1, value);
  };

  const unmerge = (r, c) => {
    const [checkR, checkC] = mergeCheck[r][c];
    const value = cell[checkR][checkC];
    for (let i = 1; i < 51; i++) {
      for (let j = 1; j < 51; j++) {
        const [checkI, checkJ] = mergeCheck[i][j];
        if (checkI === checkR && checkJ === checkC) {
          mergeCheck[i][j] = [i, j];
          cell[i][j] = '';
        }
      }
    }
    updateOne(r, c, value);
  };

  const print = (r, c) => {
    const [checkR, checkC] = mergeCheck[r][c];
    answer.push(cell[checkR][checkC] ? cell[checkR][checkC] : 'EMPTY');
  };

  for (const command of commands) {
    const cmd = command.split(' ');
    if (cmd[0] === 'UPDATE') {
      if (cmd.length === 4) updateOne(cmd[1], cmd[2], cmd[3]);
      else update(cmd[1], cmd[2]);
    } else if (cmd[0] === 'MERGE') {
      merge(cmd[1], cmd[2], cmd[3], cmd[4]);
    } else if (cmd[0] === 'UNMERGE') {
      unmerge(cmd[1], cmd[2]);
    } else if (cmd[0] === 'PRINT') {
      print(cmd[1], cmd[2]);
    }
  }

  return answer;
}