[LeetCode] 1694. Reformat Phone Number
문제 출처: https://leetcode.com/problems/reformat-phone-number/
Reformat Phone Number - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
문제
핸드폰 번호가 문자열 number
로 주어진다. number
는 숫자, 공백 ' '
. 그리고/또는 대시 '-'
로 구성된다.
주어진 number
를 특정 형태로 재구성하려고 한다. 첫째, 모든 공백과 대시를 제거한다. 그리고, 왼쪽에서 오른쪽으로 4개 이하의 숫자가 남을 때까지 3개씩 그룹화한다. 마지막 숫자는 다음의 규칙을 따라 그룹화한다:
- 2개: 길이 2의 단일 블록으로 그룹화
- 3개: 길이 3의 단일 블록으로 그룹화
- 4개: 길이가 2인 두개 블록으로 그룹화
블록들은 대시로 합쳐진다. 재구조화 과정은 길이가 1인 블록은 만들지 않으며, 길이가 2인 블록은 최대 2개까지 생성할 수 있다.
재구조화 후 핸드폰 번호 를 반환하라.
예제
Input: number = "1-23-45 6"
Output: "123-456"
Explanation: The digits are "123456".
Step 1: There are more than 4 digits, so group the next 3 digits. The 1st block is "123".
Step 2: There are 3 digits remaining, so put them in a single block of length 3. The 2nd block is "456".
Joining the blocks gives "123-456".
Input: number = "123 4-567"
Output: "123-45-67"
Explanation: The digits are "1234567".
Step 1: There are more than 4 digits, so group the next 3 digits. The 1st block is "123".
Step 2: There are 4 digits left, so split them into two blocks of length 2. The blocks are "45" and "67".
Joining the blocks gives "123-45-67".
풀이
1차적으로 주어진 문자열에 대해서 공백과 대시를 제거하는 작업을 수행해야 한다.
언어에서 제공해주는 문자열 치환 함수를 사용 혹은 for문을 통한 탐색을 통한 제거 방법이 존재한다.
// JavaScript의 replace()사용
number.replace(/[' '-]/g, '');
// for문 탐색
refined_number = '';
for (let ch of number) {
if (ch == ' ' || ch == '-') { continue; }
refined_number += ch;
}
처음 주어진 문자열에서 그룹화하는데 불필요한 문자를 제거한 후, 본격적인 그룹화 작업에 들어가는데,
3개씩 묶어 나가면 결국 마지막에 남는 숫자의 수는 0, 1, 2개가 된다. 각각에 대한 처리 방법을 생각해보아야 한다.
0 또는 2개가 남은 경우, 별다른 처리 없이 하나의 블록으로 처리하는 것으로 문제의 모든 조건은 만족시킬 수 있다.
문제는 1개가 남은 경우이다. 길이가 1인 블록은 만들지 않는다는 조건이 있으므로, 바로 앞 블록을 활용해서 이 문제를 해결할 수 있다. 앞 블록의 마지막 숫자를 분리해서 1개 남은 숫자와 결합하는 것이다.
number = "1234567"
- 숫자를 3개씩 분리
1 block = 123
2 block = 456
3 block = 7 => 길이가 1인 블록은 만들면 안됨, 2블록에서 숫자 하나를 빌려옴
- 1개 남은 블록에 대한 조치 후 블록
1 block = 123
2 block = 45
3 block = 67
이 과정을 코드로 작성하면 다음과 같다.
let ans = '';
// 왼쪽에서부터 3개씩 묶는 과정
const val = Math.trunc(N / 3);
let index = -1;
for (let i = 0; i < val; i++) {
ans += arr_nums[index+1] + arr_nums[index+2] + arr_nums[index+3] + '-';
index += 3;
}
// 남는 숫자 수에 따른 조치
let i = index+1;
if (N % 3 == 0) { ans = ans.slice(0, ans.length-1); }
else if (N % 3 == 1) {
ans = ans.slice(0, ans.length-2) + '-';
i = N-2;
}
for (; i < N; i++) {
ans += arr_nums[i];
}
Github: 1694.js
opwe37/Algorithm-Study
Contribute to opwe37/Algorithm-Study development by creating an account on GitHub.
github.com