1291.Β Sequential Digits

  • μ§€μ •λœ λ²”μœ„ [low, high] 에 μ†ν•˜λŠ” 숫자 쀑 각 자리의 μˆ«μžκ°€ μ—°μ†λ˜λŠ” 수의 λͺ©λ‘μ„ κ΅¬ν•˜λŠ” 문제.
    • 예λ₯Ό λ“€λ©΄ 3자리의 숫자 μ€‘μ—λŠ” 123, 234, 345, 456, 567, 678, 789κ°€ μžˆμ„ 수 μžˆλ‹€.
  • λ¨Όμ € λ²”μœ„ 쀑 κ°€μž₯ μž‘μ€ 숫자, 큰 숫자의 자리수 minDigits, maxDigitsλ₯Ό μ„Έμ–΄μ„œ μ €μž₯ν•œλ‹€.
  • 숫자의 자리수 λ²”μœ„λ₯Ό μˆœνšŒν•˜λ©΄μ„œ 쑰건을 λ§Œμ‘±ν•˜λŠ” 숫자λ₯Ό λ§Œλ“€μ–΄λ‚Έλ‹€.
    • (1) νŠΉμ • 자리수 n에 λŒ€ν•΄μ„œ 1λΆ€ν„° μ—°μ†λ˜λŠ” 숫자λ₯Ό λ§Œλ“ λ‹€.
      • n = 3 이라면 123을 λ§Œλ“ λ‹€.
    • (2) μ•žμžλ¦¬ 수λ₯Ό ν•˜λ‚˜μ”© λ°€μ–΄λ‚΄λ©΄μ„œ μƒˆλ‘œμš΄ 숫자λ₯Ό λ”ν•œλ‹€.
      • n = 3 이라면 123 β†’ 1230 β†’ 230 + 4 β†’ 234 와 같이 λ§Œλ“ λ‹€.
      • μ•žμžλ¦¬ 수λ₯Ό λ°€μ–΄λ‚΄λ €λ©΄ λ‚˜λ¨Έμ§€ 연산을 ν™œμš©ν•˜λ©΄ λœλ‹€.
      • n = 3 이라면 mask 값은 이 되며 ν˜„μž¬ μˆ«μžκ°€ 234라고 ν•  λ•Œ (234 * 10) % 1000 + 5 = 2340 % 1000 + 5 = 340 + 5 = 345 와 같이 λ‹€μŒ 숫자λ₯Ό λ§Œλ“€μ–΄λ‚Ό 수 μžˆλ‹€.
    • (3) λ§ˆμ§€λ§‰ 자리의 μˆ«μžκ°€ 9κ°€ λ λ•ŒκΉŒμ§€ μ§„ν–‰ν•œλ‹€.
      • n = 3 이라면 789κ°€ λ§ˆμ§€λ§‰ μ—°μ†λœ μˆ«μžμ΄λ‹€.
    • (4) λ§Œλ“€μ–΄λ‚Έ μˆ«μžκ°€ μ§€μ •λœ λ²”μœ„ [low, high]에 μ†ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.
  • (1), (2)의 과정을 λ³„λ„μ˜ λ£¨ν”„λ‘œ ν’€μ–΄λ‚Ό μˆ˜λ„ μžˆμ§€λ§Œ κ·Έλ³΄λ‹€λŠ” ν˜„μž¬ λ§Œλ“€μ–΄μ§„ μˆ«μžκ°€ νŠΉμ • 자리수 n만큼 λ˜λŠ”μ§€ ν™•μΈν•˜λŠ” 쑰건문을 μΆ”κ°€ν•˜μ—¬ 두 루프λ₯Ό 톡합할 μˆ˜μžˆλ‹€.
class Solution { int countDigits(int v) { int count = 0; while (v > 0) { ++count; v /= 10; } return count; } int createMask(int n) { int mask = 1; while (n-- > 0) { mask *= 10; } return mask; } public List<Integer> sequentialDigits(int low, int high) { List<Integer> result = new ArrayList<>(); int minDigits = countDigits(low); int maxDigits = countDigits(high); for (int n = minDigits; n <= maxDigits; ++n) { int mask = createMask(n); int value = 0; int digit = 1; while (digit <= 9) { value = (value * 10) % mask + digit; if (digit >= n && value >= low && value <= high) { result.add(value); } ++digit; } } return result; } }