알고리즘

[JS] 알고리즘 기초 정복 3-4번_가장 짧은 문자거리

햄❤️ 2021. 7. 15. 19:42
반응형

문제 3-4번

한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출 력하는 프로그램을 작성하세요.

 

🍄 입력설명

첫 번째 줄에 문자열 s와 문자 t가 주어진다. 문자열과 문자는 소문자로만 주어집니다. 문자열의 길이는 100을 넘지 않는다.

 

🍄 출력설명

첫 번째 줄에 각 문자열 s의 각 문자가 문자 t와 떨어진 거리를 순서대로 출력한다.

 

🍄 입력예제 1

teachermode e

 

🍄 출력예제 1

1 0 1 2 1 0 1 2 2 1 0

 


정답 코드

- 문제를 먼저 잘 이해한다. t로 주어진 값(예제에서는 e)는 문자열 좌, 우를 기준으로 몇번째에 있는지 찾고, 좌/우 중에 최소값을 배열에 넣어서 출력하는 문제이다. 예를들면 teachermode 의 4번쨰 인덱스에 있는 h에서 e는 왼쪽으로 3번째, 오른쪽으로 1번째에 있으므로 최소값인 1을 answer 배열에 추가한다. 

  - for문을 두 번 돈다. 첫번째 for문은 왼쪽에서 오른쪽으로 탐색하고, 두번째 for문은 오른쪽에서 왼쪽을 탐색한다. 두번의 탐색에서 최소값을 answer 배열에 추가한다.

 - 문자열의 길이는 1000을 넘지 않으므로, p를 1000으로 둔다. for문에서 t를 만나면 p를 0으로 초기화하고, p를 만나지 않으면 숫자를 1씩 증가시킨다.

 - 첫번째 for문에서 answer 배열을 채워준다. 두번째 for문에서는 t를 만나면 어차피 0이고, t가 아닌 수를 만났을때 기존 answer[i] 번째 배열과, 현재 p값을 비교하여 더 작은 값을 (Math.min) 비교하여 바꿔준다. 

function solution(s, t) {
	let answer = [];
	let p = 1000;
	for (let x of s) {
		if (x === t) {
			p = 0;
			answer.push(p);
		} else {
			p++;
			answer.push(p);
		}
	}
	p = 1000; //초기화 해야한다.
	for (let i = s.length - 1; i >= 0; i--) {
		if (s[i] === t) p = 0;
		else {
			p++;
			answer[i] = Math.min(p, answer[i]);
		}
	}
	return answer;
}

let str = "teachermode";
let t = "e";
console.log(solution(str, t));
// (11) [1, 0, 1, 2, 1, 0, 1, 2, 2, 1, 0]
728x90
반응형