[알고리즘]문자열 탐색:가장 짧은 문자거리, 문자열 압축

chaewon Im·2022년 1월 23일
0

4.가장 짧은 문자 거리

📃 문제

한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소 거리를 출력하는 프로그램을 작성하시오.
문자열과 문자는 소문자로만 주어집니다.

[입력 예제]
teachermode e
[출력 예제]
1 0 1 2 1 0 1 2 2 1 0

✏️ 풀이

어려워서 해설 초반부 보고 힌트 얻어서 겨우 풀었다..

✨힌트!✨
문자열을 앞에서 뒤로 1번, 뒤에서 앞으로 1번 순회함.
더 작은 값을 뽑기 위해 일단 초기값을 1000으로 설정해놓고,
문자 t가 아닌 문자를 만나면 ++하고, 문자 t를 만나면 0으로 초기화 함.

이렇게 하면 t에서부터의 거리가 순차적으로 나타나는데, 이 숫자들을 배열로 하나씩 push함.

앞에서 뒤로 가면 [1001,0,1,2,3,0,1,2,3,4,0] 배열이 됨.
뒤에서 앞으로 한번 더 돌면서 위에서 만든 배열과 값을 비교함.
뒤에서부터 돌면서 배열의 뒤 쪽 값과 비교해 더 작은 수가 나타나면 교체한다.

이 때 뒤에서 앞으로 한번 더 돌 때의 값은 앞에서부터 순서대로 [1,0,3,2,1,0,4,3,2,1,0]이 됨.
-> 뒤에서부터 비교해볼때 0은 같으니까 0, 4는 1보다 크니까 1로 변환, 이런식으로 비교하면서 진행함.

function solution(s,t){
    let answer = []
    let num = 1000
    for(let i=0;i<s.length;i++){
        if(s[i]===t) num = 0
        else num++
        answer.push(num)
    }

    num = 1000
    for(let i=s.length-1;i>=0;i--){
        if(s[i]===t) num = 0
        else num++

        if(answer[i] > num) answer[i] = num
    }

    return answer
}

let s = 'teachermode'
let t = 'e'
console.log(solution(s,t))

5.문자열 압축

📃 문제

알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.
단 반복횟수가 1인 경우 생략합니다.

[입력 예제]
KKHSSSSE
[출력 예제]
K2HS4E

✏️ 내 풀이

1)앤써는 빈 문자열,카운터 변수는 1로 초기화한다
2)문자열을 순회한다
->if (현재 문자 == 그 다음 문자) => 카운터++,
->else => if 카운터>1 이면 answer += 현재 문자 + 카운터, else answer+=현재문자
카운터 = 1로 다시 초기화

function solution(s){
    s += '' //풀이 보완: 마지막 문자 비교 시 인덱스 오류방지를 위해 공란을 추가한다.
    let answer = ''
    let count = 1
    for(let i=0;i<s.length;i++){
        if(s[i]===s[i+1]){
            count++
        }else{
            //풀이 보완:answer에 일단 문자는 추가하고,
            //카운터가 1보다 큰 경우에만 문자화 시킨 count를 함께 추가해준다.
            answer += s[i]
            if(count > 1) answer += String(count)
            count = 1
        }
    }
    return answer
}

let s = 'KKHSSSSSSE'
console.log(solution(s))
profile
빙글빙글 FE 개발자

0개의 댓글