10월, 2019의 게시물 표시

[프로그래머스] 쿠키 구입 javascript

[2018 윈터코딩] 쿠키 구입 javascript 조건 * 각 바구니 안에 들은 과자 수가 차례로 들은 배열 cookie가 주어질 때(오름차순 정렬) * 두 아들이 받을 과자 수는 같아야 합니다(1 <= l <= m, m+1 <= r <= N) * A[i] 를 i번 바구니에 들어있는 과자 수라고 했을 때, A[l]+..+A[m] = A[m+1]+..+A[r] 를 만족해야 합니다 * 한 명의 아들에게 줄 수 있는 가장 많은 과자 수를 return(조건에 맞지 않으면 0을 return) 제한사항 cookie의 길이는 1 이상 2,000 이하입니다. cookie의 각각의 원소는 1 이상 500 이하인 자연수입니다. 입출력 예 cookie result [1,1,2,3] 3 [1,2,4,5] 0 코드 function solution(cookie) { var answer = 0; if (cookie.length <= 2) { if (cookie.length == 2 && cookie[0] == cookie[1]) { answer = cookie[0]; } return answer; } //이분탐색 const len = cookie.length-1; for (let i = 0; i < len; i++) //경계선 { let presum = cookie[i]; //첫째 총 과자갯수 let preidx = i; //첫째 마지막에 추가한 바구니 위치 let postsum = cookie[i+1]; //둘째 총 과자갯수 let postidx = i+1; //둘째 마지막에 추가한 바구니 위치 //경계선을 기준으로 idx가 0 || len에 도달할

[프로그래머스] 방문 길이 javascript

[2018 윈터코딩] level3 방문 길이 javascript 조건 * 좌표평면의 경계를 넘어가는 명령어는 무시 * 처음 걸어본 길의 길이를 구하여 return 제한사항 dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다. dirs의 길이는 500 이하의 자연수입니다. 입출력 예 dirs answer ULURRDLLU 7 LULLLLLLU 7 코드 function solution(dirs) { let answer = []; let gps = [0,0]; dirs.split("").forEach((value) => { let ret = false; const pre_gps = gps.concat(); if (value == "U" && gps[1] < 5) { gps[1] += 1; ret = true; } else if (value == "D" && gps[1] > -5) { gps[1] -= 1; ret = true; } else if (value == "R" && gps[0] < 5) { gps[0] += 1; ret = true; } else if (value == "L" && gps[0] > -5) { gps[0] -= 1; ret = true;

[프로그래머스] 소수 만들기 javascript

[2017 서머코딩] level2 소수 만들기 javascript 조건 * nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 제한사항 nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다. nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다. 입출력 예 nums result [1,2,3,4] 1 [1,2,7,6,4] 4 코드 function solution(nums) { let answer = 0; //1. 3자리 숫자 만들기 const len = nums.length; for (let i = 0; i < len; i++) { for (let j = i+1; j < len; j++) { for (let k = j+1; k < len; k++) { const number = nums[i]+nums[j]+nums[k]; if (isPrime(number)) answer++; } } } //2. 소수 판별(2~number까지 하나씩 비교) function isPrime(number) { if (number < 2) return true; for (let i = 2; i < number; i++) { if (number % i == 0) return false; } return true; } return answer; }

[프로그래머스] 폰켓몬 javascript

[찾아라 프로그래밍 마에스터] level2 폰켓몬 javascript 조건 * 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택 * 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 제한사항 nums는 폰켓몬의 종류 번호가 담긴 1차원 배열입니다. nums의 길이(N)는 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다. 폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다. 가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도, 선택할 수 있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다. 입출력 예 nums result [3,1,2,3] 2 [3,3,3,2,2,4] 3 [3,3,3,2,2,2] 2 코드 function solution(nums) { let max = nums.length / 2; //골라야하는 갯수 //중복제거 let stack = []; nums.concat().forEach(value => { if (stack.indexOf(value) === -1) stack.push(value) }); return stack.length >= max ? max : stack.length; }

[프로그래머스] 예상 대진표 javascript

[탐욕법] level2 예상 대진표 javascript 조건 * 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다. * 몇 번째 라운드에 만나는지 반환 제한사항 N : 2 1  이상 2 20  이하인 자연수 (2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.) A, B : N 이하인 자연수 (단, A ≠ B 입니다.) 입출력 예 N A B answer 8 4 7 3 코드 function solution(n,a,b) { let answer = 0; while (a != b) { answer++; a = Math.ceil(a/2); b = Math.ceil(b/2); } return answer; }

[프로그래머스] 영어 끝말잇기 javascript

[2018 서머코딩] level2 영어 끝말잇기 javascript 조건 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다. 이전에 등장했던 단어는 사용할 수 없습니다. 한 글자인 단어는 인정되지 않습니다. 제한사항 끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다. words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다. 단어의 길이는 2 이상 50 이하입니다. 모든 단어는 알파벳 소문자로만 이루어져 있습니다. 끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다. 정답은 [ 번호, 차례 ] 형태로 return 해주세요. 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요. 입출력 예 n words result 3 [ tank ,  kick ,  know ,  wheel ,  land ,  dream ,  mother ,  robot ,  tank ] [3,3] 5 [ hello ,  observe ,  effect ,  take ,  either ,  recognize ,  encourage ,  ensure ,  establish ,  hang ,  gather ,  refer ,  reference ,  estimate ,  executive ] [0,0] 2 [ hello ,  one ,  even ,  never ,  now ,  world ,  draw ] [1,3] 코드 function solution(n, words) { const len = words.length; let stack = {}; //object에 property로 저장 //단어수(words) 만큼 loop for (let

[프로그래머스] 구명보트 javascript

[탐욕법] level2 구명보트 javascript 조건 * 구명보트에 최대 2명까지 탑승 가능 * 구명보트의 무게를 초과하여 탑승 불가능 제한사항 무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다. 각 사람의 몸무게는 40kg 이상 240kg 이하입니다. 구명보트의 무게 제한은 40kg 이상 240kg 이하입니다. 구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다. 입출력 예 people limit return [70, 50, 80, 50] 100 3 [70, 80, 50] 100 3 코드 function solution(people, limit) { //limit와 같은 무게의 사람들의 경우 1명만 탑승 가능하므로 제외 let array = people.filter(value => value < limit); let answer = people.length - array.length; array.sort((a,b) => b-a); //내림차순으로 정렬 while (array.length > 0) //배열이 존재하는 동안 loop { const number = array.pop(); //가장 낮은 몸무게를 배열에서 제외 const idx = array.findIndex(value => value + number <= limit); //같이 탑승 가능한 최대무게의 승객의 index를 탐색 if (idx !== -1) //동승 가능한 최대 몸무게의 사람이 있는 경우 { array.splice(0, idx + 1); //동승 가능한 사람의 위치까지 배열에서 제외(앞의 사람들은 혼자만 탑승 가능) answer += idx + 1

[프로그래머스] 카펫 javascript

[완전탐색] level2 카펫 javascript 조건 * 빨간색 격자는 카펫 중앙에 위치, 갈색은 카펫 테투리에 그려짐 * 빨간색 격자는 사각형의 형태로 중앙에 존재해야 함 제한사항 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다. 빨간색 격자의 수 red는 1 이상 2,000,000 이하인 자연수입니다. 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다. 입출력 예 brown red return 10 2 [4, 3] 8 1 [3, 3] 24 24 [8, 6] 코드 function solution(brown, red) { var answer = []; let bflag = false; //정답 구한 경우 loop에서 나오기 위한 변수 //가로길이를 1부터 red길이까지 loop for (let i = 1; i <= red; i++) { //세로길이를 1~가로길이 까지 loop for (let j = 1; j <= i; j++) { const size = i * j; //red의 갯수를 계산 if (red === size) //red와 같은 경우 { if (brown === (((i+2) * 2) + (j * 2))) //brown의 갯수와 같은지 판단 { answer = [i+2,j+2]; //brown의 경우 red를 감싸는 형태로 존재해야 함 bflag = true; //가로길이 loop를 break break; } } } if (bflag) break;

[프로그래머스] 숫자 야구 javascript

[완전탐색] level2 숫자 야구 javascript 조건 * 숫자는 맞지만, 위치가 틀렸을 때는 볼 * 숫자와 위치가 모두 맞을 때는 스트라이크 * 숫자와 위치가 모두 틀렸을 때는 아웃 제한사항 질문의 수는 1 이상 100 이하의 자연수입니다. baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다. 입출력 예 baseball return [[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2 코드 function solution(baseball) { let answer = 0; const len = baseball.length; //123~987까지의 숫자 중 정답가능성이 있는 숫자를 찾는다. for (let i = 123; i <= 987; i++) { const number = i+""; //중복되는 숫자, 십의자리/일의 자리에 0이 존재하는 경우는 건너뛴다. if (number.charAt(0) == number.charAt(1) || number.charAt(1) == number.charAt(2) || number.charAt(2) == number.charAt(0) || number.charAt(1) == "0" || number.charAt(2) == "0") continue; let bflag = true; //사용자가 질문한 배열에 현재의 숫자를 대입하여 동일한 결과를 얻는지 체크한다. for (let j = 0; j < len; j++) { const callNumber = baseball[j][0]+""; const stri