JS 알고리즘 문제풀이/섹션 1. 기본문제 풀이 18

17.중복단어제거

📌강의정리 n개의 문자열중에서 중복된 단어를 제거하고 내라는 문제이다. 앞에서 사용했던 indexOf를 써서 풀어보자. s라는 배열은 문제에서 제공받은 문자열이다. 먼저 indexOf("time")을 해서 어떤 값이 반환되는지 알아보자. answer=s.filter(); 를 하면 s라는 객체가 filter()라는 메소드를 호출했다. filter는 원본배열을 바꾸는게 아닌 변환된 배열을 새로만든다. filter(function(v,i){이 내부는 콜백함수의 내부이다.}); filter라는 메소드가 의미하는 것은 s라는 객체의 value를 하나씩 거치면서 콜백함수를 호출한다. 이제 if(s.indexOf(v)===i) 가 성립되면 return true; 를 하면 filter는 true인 값만 새로운 객체에 ..

16.중복문자제거(indexOf)

📌강의정리 단어가 들어오면(소문자로 된) 중복제거하고 출력하는 문제이다. indexOf라는 메소드를 사용할 것이다. console.log(s.indexOf("k"));를 하면 0이뜬다. indexOf는 문자열에서 제일 처음있는 문자의 인덱스를 출력한다. indexOf('k', 1)을 하면 1번인덱스부터 찾아서 나오는 k의 인덱스를 반환한다. 이거 이용하면 특정문자찾기도 가능하다. for of 쓰면 안되고 for(;;)써야 한다. i를 변수로 콘솔을 다 찍으면서 indexOf의 흐름을 알아보자. 이제 if(s.indexOf(s[i])===i) 를 이용해서 처음발견된 위치와 본래의 위치가 같으면 answer 에 s[i]를 누적하면 된다. 특정문자의 개수를 찾는 것도 가능하다. let pos=s.indexOf..

15.가운데 문자 출력(substring, substr)

📌강의정리 홀수면 가운데 하나, 짝수면 가운데에 2개를 출력해야하는 문제이다. Math.floor를 쓰면 내림이니까 몫을 얻을 수 있다. Math.floor(s.length/2)는 홀수이면 가운데의 인덱스번호를 가리킨다. 그 다음 if를 이용해서 %2를 이용해 주어진 문자열의 길이가 홀수인지 짝수인지 판별한다. 홀수이면 s.substring(mid, mid+1); 를 하면 mid부터 mid+1전까지이므로 mid만 나오게 된다. 짝수인경우는 가운데 두개중 높은부분이 mid이므로 s.substring(mid-1, mid+1)을 해야 가운데 두개 (mid-1, mid )가 인덱스기준 주소로 나온다. 또한 substr도 있다. substr(2,4)는 2번 인덱스부터 4개를 뽑아 5번인덱스까지 총 4개를 뽑아내라..

14.가장 긴 문자열

📌강의 정리 n개의 문자열 중에서 가장 긴 문자열을 출력하는 문제이다. 각 문자열의 길이가 다르므로 length를 쓰면 간단히 풀 수 있다. 우선 for문을 한다. max값은 가장 작은 값인 Number.MIN_SAFE_INTEGER; 를 하면 된다. 그 이후에는 max값은 x의 길이, answer는 x의 값을 넣으면 된다. 📌느낀점 아주 쉬운 문제였다. 단지 제일 큰 값과 제일 작은 값을 설정할때 Number.MIN_SAFE_INTEGER; 를 쓴다는 것을 기억하자. Number.MAX_SAFE_INTEGER; //나의 코드 //강사님 코드

13.대소문자변환

📌강의정리 문자 하나하나를 탐색하면서 했는데 원래는 대소문자로 변환하려면 그냥 toUpperCase()를 쓰면 한번에 끝나는 데 하나하나를 탐색했던이유는 이 문제처럼 문자하나하나를 변환하게 하는 코딩테스트 문제가 나오기 때문이다. for(let x of s)로 하나하나 탐색을 한다. 그다음 if(x === x.toUppercase())로 대문자인지 확인이 가능하다. 맞다면 toLowerCase()로 소문자로 바꿔주고 아니라면 else로 대문자로 바꿔주면 된다. 📌느낀점 자꾸 대소문자 변환에서 익숙한 아스키코드를 사용하는것 같다. 코드의 길이는 어퍼케이스를 쓰는게 이득이므로 어퍼케이스를 쓸 수 있도록 의식적으로 연습해야겠다. //나의 코드 //강사님 코드

12.대문자로 통일

📌강의 정리 대문자는 그대로 두고 소문자를 찾으면 대문자로 바꿔준다. 우선 let x of s로 하나씩 찾는다 이때 if문을 사용한다. 소문자로 바꿔주는 것은 toLowerCase()이므로 문자 하나씩 소문자로 바꿔줘서 비교하는 조건문을 걸어준다. 이때 정답 문자열에 += 연산자를 써서 하나씩 넣어주면 된다. ascii코드로도 풀 수 있다. num값을 charCodeAt()으로 아스키로 넣어준후 97, 122로 비교하여 소문자 찾고 ascii값에서 32를 빼어 대문자로 바꿔주면 된다. 이제 이 숫자를 다시 문자로 바꿔줘야 한다. String.fromCharCode(num-32) 이다. 📌느낀점 11번 문제의 연장선상에 있는 문제이다. 대문자가 소문자로 바뀌는 코드가 toLowerCase()라는 것과 as..

11.대문자 찾기

📌강의 정리 대문자는 총 3개이다. 고전적인 방법은 toUpperCase()를 사용하는것이다. x.toUpperCase()하면 x자체를 바꾸는것이 아닌 x의 대문자 값을 출력한다. x값이 변하지는 않음 깊은 복사 x= x.toUpperCase() 하면 다 바뀐다. 아스키 코드 방법도 있다. let num = x.charCodeAt() 로 하면 num에 순서대로 x의 아스키코드가 저장된다. 이것도 원래 배열을 바꾸는 것이 아닌 바뀐값을 출력하는 것이므로 if문이용하여 하나씩 비교하면된다. 📌느낀점 구글링을 조금 했지만 문제 풀기전부터 아스키코드를 이용해야겠다는 생각은 했다. 어려운점은 크게 없다. 두가지만 기억해두자 문자를 아스키코드로 바꿔주는 x.charCodeAt() 문자를 대문자로 바꿔주는 x.toU..

10.문자 찾기

📌강의 정리 그냥 간단하게 let x of s 를 쓴다. if문써서 하나씩 판별하면 된다. 내장함수도 한번 써보자. s.split(t)를 하면 t가 R이었으므로 R을 구분자로 문자열을 나누어 배열로 반환한다. 그러므로 R의 개수 +1이 반환되니까 s.split(t).length 를 하면 answer -1을하면 답이 나온다. 📌느낀점 쉬운 문제였다. 생각한대로 바로 풀면되고 추가로 알려주신 split메서드를 나중에도 잘활용하면 좋을 것 같다. //나의 코드 //강사님 코드

9.A를 #으로

📌강의 정리 함수에서 s로 받는다. answer = ""; 로 하면 문자열이라고 선언 할 수 있다. for x of s 를 하고 if x==='A'를 해서 맞으면 answer+='#' 를 누적하고 아니라면 그냥 x값을 answer +=x; 를 통해 그냥 넘어가면 끝이다. 다른 방법도 있다. replace라는 함수를 쓰는 것이다. s=s.replace(/A/, '#')이면 모든 A가 #으로 바뀌지 않는다 /A/는 처음 만나는 A만 바뀌는거고 /A/g 를 해야 모든 값이 바뀌고 let answer=s;는 문자열이기에 얕은복사가 아니라 깊은 복사가 된다. 따라서 answer=answer.replace를 해서 직접 바꿔주어야 한다. 배열 또한 slice를 하면 깊은 복사를 할 수 있지만 그건 나중에 알아보자. ..

8.일곱난쟁이

📌강의 정리 가짜 난쟁이 두개를 제외시키고 출력하자 9개의 숫자중 2개의 숫자를 빼서 가짜인지 확인해보는 과정을 반복한다. 이중 for문이 돌아야한다. i와 j가 가짜인지 확인하자 9명의 총합을 sum이라고 구해놓고 arr[i]와 arr[j]값을 더한후 그값을 sum에서 빼면 그 값이 가짜난쟁이이다. splice를 쓰자. 얕은 복사를 해서 arr값을 복사해두자. 얕은복사는 answer = arr인데 arr값이 바뀌면 answer값도 바뀐다. let sum=arr.reduce((a,b)=>a+b,0); 를 써서 sum을 우선 다 더한값으로 넣는다. 이중 포문에서 처음에는 i=0 그 다음에는 j=i+1로 한다. i뒷편부터 구해야 하기 때문이다. 적절히 콘솔을 넣어서 부분적으로 계속 디버깅하자 console...