전화번호가 문자열 형태로 주어져 있다고 가정해 봅시다. 이 전화번호는 숫자와 공백, 그리고 하이픈('-')으로 구성되어 있습니다. 우리는 이 전화번호를 정해진 규칙에 따라 새로운 형식으로 다시 포맷하려고 합니다. 규칙은 다음과 같습니다.
문자열에 포함된 모든 공백과 하이픈을 제거합니다.
남은 자릿수가 4개 이하가 될 때까지, 왼쪽부터 오른쪽 방향으로 숫자를 3자리씩 묶습니다.
마지막에 남은 자릿수는 아래와 같이 그룹화합니다.
2자리 남은 경우: 길이 2짜리 블록 하나로 구성합니다.
3자리 남은 경우: 길이 3짜리 블록 하나로 구성합니다.
4자리 남은 경우: 길이 2짜리 블록 두 개로 나누어 구성합니다.
이렇게 만들어진 블록들은 하이픈(-)으로 연결됩니다. 즉, 우리가 찾아야 하는 것은 재구성된 전화번호입니다.
예를 들어 입력이 s = "9-6-84102-4 7-8"이라면, 출력은 "968-410-24-78"이 됩니다.
해결 접근 방법
이 문제를 해결하기 위해 다음 단계를 따릅니다.
digits := 빈 문자열로 초기화
blk := 빈 문자열로 초기화
s의 각 문자 i에 대해 반복합니다.
i가 숫자라면 → blk := blk에 i를 이어 붙입니다.
blk의 길이가 3이 되면 → digits := digits에 blk과 하이픈("-")을 이어 붙이고, blk := 빈 문자열로 초기화합니다.
반복이 끝난 후 blk의 길이가 0이라면 → digits에서 마지막 하이픈을 제외한 부분(digits[:-1])을 반환합니다.
blk의 길이가 1이라면 → 마지막 두 자리를 하나의 블록으로 재배치해야 하므로, digits[:-2] + "-" + digits[-2] + blk을 반환합니다.
blk의 길이가 2라면 → digits에 blk을 그대로 이어 붙여 반환합니다.
예제 코드 (Python)
다음 구현을 통해 더 잘 이해해 보겠습니다.
def solve(s):
digits = ""
blk = ""
for i in s:
if i.isnumeric():
blk += i
if len(blk) == 3:
digits += blk+"-"
blk = ""
if len(blk) == 0:
return digits[:-1]
elif len(blk) == 1:
return digits[:-2]+"-"+digits[-2]+blk
elif len(blk) == 2:
return digits+blk
s = "9-6-84102-4 7-8"
print(solve(s))입력
"9-6-84102-4 7-8"
출력
968-410-24-78