JS 알고리즘 문제풀이 62

4.점수계산

📌강의 정리 문제가 길다고 겁먹지말자 1이 들어오면 cnt를 ++하면 된다. 그리고 이것을 answer에다가 누적하면된다. 그러다 0을 만나면 cnt를 0으로 초기화하면된다. 이렇게 계속 누적되면 answer가 답이 된다. 포문 돌릴때 x of arr 쓸 수 있다면 쓰는게 편리하고 좋다. 📌느낀점 푸는 방법도 코드도 다 강사님과 내가 같았다. 문제는 길었지만 쉬웠다. 번뜩이는 아이디어가 중요하다. 코드에서 문제가 읽히게 하자. //나의 코드 //강사님 코드

3.가위바위보

📌강의 정리 가위바위보 정보가 숫자로 들어온다. a배열 b배열로 받았다. 두 배열의 길이는 같기에 a.length를 써서 포문돌리면 다 돈다. 승부결과는 a입장에서만 보면 이길 수 있는 경우는 3가지이다. 1,2,3으로 이기는 경우이다. a가 1을 내면 && b가 3을 내야한다. 마찬가지로 2,3을 간다. 그리고 else는 b가 이기는 경우 앞서 같은경우는 비기는 경우로 한다. 📌느낀점 나는 a가 이기는 경우와 b가 이기는 경우를 코딩하고 else로 비기는경우를 했는데 그러지말고 비기는경우 a가 이기는 경우하고 b가 이기는 거는 else로 하는게 더 유리한것같다. 그리고 이렇게 해서 코드를 절약하면 하드코딩으로 1,2,3 다 한줄씩 지정해준다. 나의 방식이던 둘을 뻈을때 1 && 3,1은 의미가 확장되면..

2.보이는 학생

📌강의 정리 앞에 사람보다 크면 보이고, 작거나 같으면 안보인다. 배열만 솔루션으로 받으면 된다. i를 정해서 i가 앞에보다 크면 count하면 되는데 이걸 이중포문 쓰면 시간 복잡도가 O(N^2)가 된다. 그러므로 포문 하나만 써야한다. max값을 i일때 i앞에서의 제일 큰사람으로 정한다. max값은 새롭게 보일때마다 카운팅해주면서 다시 정해주면 된다. 처음은 무조건 보이니까 카운트 1로 시작하고 max값은 arr[0]으로 시작한다. 반복문도 1부터 시작한다. 📌느낀점 나와 다른점은 처음에 카운팅을 하나해주고 max값을 arr[0]으로 시작한다는 점이다. 그래서 반복문이 1부터 시작하는데 아직은 나와 강사님 중 어떤게 더 효율적인지 시간복잡도를 잘 몰라서 모르겠다. 나중에 시간복잡도를 알아봐야 한다. ..

1.큰 수 출력하기

📌강의 정리 1차원 배열을 탐색하는 문제이다. 배열을 리턴으로 받으니까 우선 앤서를 배열로한다. 첫번째 숫자는 무조건 받으니까 우선 푸쉬로 받는다. 우리는 입력값에서 배열만 넘기는 거로 한다. 이후 for문을 돌려 배열을 하나씩 탐색하는데 이때 if문으로 앞뒤 하나씩비교하여 크면 출력하면 된다. 📌느낀점 내가 푼 풀이방식이랑 똑같다. 쉽다. //나의 코드 //강사님 코드

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..