[Coding-Test]Take-2, K자리 제거

leetcode, Remove K Digits

해당 문제는 파파고 번역을 통해 풀이를 하였습니다.

문제

음수가 아닌 정수 num과 정수 k를 나타내는 문자열 숫자가 주어지면, num에서 k자리를 제거한 후 가능한 가장 작은 정수를 반환한다.

  • 1 <= k <= num.length < = 105
  • num는 숫자로 이루어져있다.
  • num는 0자체를 제외하고 0으로 시작하지 않는다.

예제

예제 1

Input	: num = "1432219", k = 3
Output	: "1219"

예제 2

Input	: num = "10200", k = 1
Output	: "200"

예제 3

Input	: num = "10", k = 2
Output	: "0"

초기값

/**
 * @param {string} num
 * @param {number} k
 * @return {string}
 */
var removeKdigits = function(num, k) {
}

나의 풀이

하... 풀지 못하였다...
문제를 전혀 이해하지 못하였었다. K값의 의미를 이해 하지 못하여서 풀이가 나오지 못하였다.

다른 사람의 풀이

전혀 풀이를 하지 못하였기에 다른 사람의 풀이를 참고하였다.
해당 자료는 유튜브에서 찾았다.
Remove K Digits — solve problem javascript and design algorithm on leetcode
numk를 입력받아 k를 새로운 변수 counter에 담아 주고
num을 배열로 numArr을 만들어 주었다.
결과값을 출력할 result리스트 변수를 선언하였다.
p.s 나도 여기까지 생각은 같았다.
for반복문안에있는 while이 이해가 잘 되지않았다...
그래서 주석을 달아가며 이해를 하도록 하였다...

var removeKdigits = function (num, k) {
	if (k >= num.length) {
		// 입력한 K값이 num의 길이보다 같거나 크면 num이 모두 사라지기 때문에 return을 0을 해준다.
		return '0';
	}
	let counter = k; // k만큼 반복을 진행해야 하기 때문에 새로운 변수에 담아준다.
	const numArr = num.split(''); // num을 리스트로 만들어준다.
	const result = []; // 출력값이 저장될 리스트를 만들어준다. (스택으로 활용)

	for (let i = 0; i < numArr.length; i++) {
		// numArr의 길이만큼 반복을 해준다.
		const digit = parseInt(numArr[i], 10); // numArr의 값을을 10진수의 정수형으로 바꿔준다
		while (counter > 0 && result.length > 0 && result[result.length - 1] > digit) {
			// k만큼 제거를 해주어야 한다.
			// 출력되는 result의 초기가 빈 리스트 이기때문에 result.length이 0보다 커야한다.
			// result에 이전에 들어간 digit값과 지금의 digit의 값을 비교해서 이전의 값이 크면 이전의 값을 제거한다.
			result.pop(); // result에서 최근의 값을 제거한다.
			counter--; // k의 횟수가 줄어든다.
		}
		if (result.length !== 0 || digit > 0) {
			// result의 첫번째 위치에 0이 오지 못하게 한다.
			result.push(digit);
		}
	}
	while (counter > 0) {
		// K 만큼의 수를 제거 하지 않았을 때 제거함
		result.pop();
		counter--;
	}
	if (result.length === 0) {
		// 결과값인 result의 길이가 0이면은 출력값도 0이다.
		return '0';
	}
	return result.join(''); // 리스트를 이어붙여 문자열로 출력
};

후기

코딩테스트로 해당 문제를 접하였는데 제한시간은 따로 없었고 말로 풀이과정을 설명해보라고 하였다. 문제 자체를 이해를 하지 못하여서... 못풀겠다고 하고 그렇게 코딩테스트는 종료되었다.

코딩테스트를 전혀 준비하지 않았던 상황이였기도 하였고
Velog를 시작하는 계기가 되었다.

좋은 웹페이지 즐겨찾기