-
[코딩테스트] 프로그래머스 javascript 1단계 - 햄버거 만들기,둘만의 암호 ,개인정보 수집 유효기간,옹알이(2),문자열 나누기,신고결과 받기,성격유형 검사하기알고리즘/코딩 테스트 2023. 2. 6. 20:04
햄버거 만들기
https://school.programmers.co.kr/learn/courses/30/lessons/133502
문제 설명
햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.
예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.
상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.
시간 초과 코드
- 시간 초과 코드 (6개)
: 1231을 찾아 replace를 한다.
- replace 메서드가 연산 시간이 많이 걸린다.
function solution(ingredient) { //1231 var answer = 0; let burgur = '1231' let index = ingredient.indexOf(1) let str = ingredient.join('').substring(index) while (str.includes(burgur)) { answer++; str = str.replace(burgur,'') } return answer; }
문제풀이
- 1. 스택을 생성해서 재료를 넣는다.
- 2. 스택의 마지막 4개가 1231일 경우 stack을 4개 잘라내고 count를 추가한다.
이 문제는 stack을 이용해서 푸는 것이 알고리즘과 자료구조상 좋다.
function solution(ingredient) { let stack = [] let count =0 ; for(let i=0;i<ingredient.length;i++){ stack.push(ingredient[i]) let index = stack.length-1 if (stack[index] ===1 && stack[index-1]===3 && stack[index-2]===2 && stack[index-3]===1) { count++; stack.splice(-4) } } return count }
둘만의 암호
https://school.programmers.co.kr/learn/courses/30/lessons/155652
문제 설명
두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.
- 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.
- index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
- skip에 있는 알파벳은 제외하고 건너뜁니다.
예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다.
두 문자열 s와 skip, 그리고 자연수 index가 매개변수로 주어질 때 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해주세요.
알파벳
abcdefghijklmnopqrstuvwxyz문제풀이
- skip에 해당하는 문자 제외한 string을 생성한다.
- alpha에서 인덱스를 찾은 후 index를 더해주는데 이때, string 길이를 초과할 수 있으므로 나머지로 저장한다.
- 각각의 계산 값을 answer 에 더해준다.
function solution(s, skip, index) { let alpha = 'abcdefghijklmnopqrstuvwxyz'.split('').filter(v=>!skip.includes(v)).join('') let answer = '' s.split('').forEach(v=>{ let i = (alpha.indexOf(v) + index ) % alpha.length answer += alpha[i] }) return answer }
개인정보 수집 유효기간
https://school.programmers.co.kr/learn/courses/30/lessons/150370
문제 설명
슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.
이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.
- 실패율은 다음과 같이 정의한다.
- 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.
문제풀이
- 1. 먼저 today를 split 메서드를 이용해서 나누고 현재 날짜를 일수로 계산한다.
- 2. terms를 " "로 나눈다.
- 3. privacies를 각각 pday,t로 나눈 후 pday를 다시 split 하여 일수를 계산한다.
- 4. 계약 날짜에서 기간까지 더한 값과 현재 날짜와 비교 후 result에 push 한다.
- 5. 단, 폐기 해야 하는 순서를 넣어야 하므로 기간이상인 값 즉, today>=period 이다.
function solution(today, terms, privacies) { let result = [] const [y,m,d] = today.split('.').map(Number) const todays = y*12*28 + (m-1)*28 + d const term = terms.map(v=>v.split(' ')) // console.log(term) privacies.forEach((v,i)=>{ const [pday,t] = v.split(' ') const [py,pm,pd] = pday.split('.').map(Number) let j=0; term.forEach((e,k)=>{ if (e[0]===t) { j = e[1]*1; break; } }) const period = py*12*28 + (pm-1)*28 + pd +j*28 if (todays >= period) result.push(i+1) }) return result }
문자열 나누기
https://school.programmers.co.kr/learn/courses/30/lessons/140108
문제 설명
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
- 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
- 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
- s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
- 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
문제풀이
- 기준, 기준 횟수, 다른 횟수를 저장하는 변수를 저장한다.
- 매개변수 s를 for문 돌리며 same과 dif이 같을 때 count를 +1 해주며 기준값을 초기화한다.
function solution(s) { let count = 0; let same = 0; let dif = 0; let cur = 0; for (let i = 0;i<s.length;i++){ if(same===dif){ same++; count++; cur = s[i] } else{ if(cur===s[i]) same++ else dif++ } } return count; }
옹알이(2)
https://school.programmers.co.kr/learn/courses/30/lessons/133499
문제 설명
머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
문제풀이
- 조카가 말할 수 있는 단어를 배열로 저장한다.
- babbling을 for문 돌면서 word를 연속으로 말한 것이 있는지 확인하고 아니면 split 한다.
이때 join(' ')을 해줘야 하는데, 그 이유는 가능한 word를 제외하고 그냥 결합시킬 경우 새로운 단어를 조합할 수 있다.
- 공백으로 split한 후 join 한 후 길이를 측정한다.
function solution(babbling) { let count = 0 const word = ["aya", "ye", "woo", "ma" ] for(let i=0;i<babbling.length;i++){ let str = babbling[i] for (let w of word) { if(babbling[i].includes(w.repeat(2))) break; else {str = str.split(w).join(' ') } } if (str.split(' ').join('')==='') count++ } return count }
신고결과 받기
https://school.programmers.co.kr/learn/courses/30/lessons/133499
문제 설명
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
- 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.
유저 ID유저가 신고한 ID설명"muzi" "frodo" "muzi"가 "frodo"를 신고했습니다. "apeach" "frodo" "apeach"가 "frodo"를 신고했습니다. "frodo" "neo" "frodo"가 "neo"를 신고했습니다. "muzi" "neo" "muzi"가 "neo"를 신고했습니다. "apeach" "muzi" "apeach"가 "muzi"를 신고했습니다. 각 유저별로 신고당한 횟수는 다음과 같습니다.
유저 ID신고당한 횟수"muzi" 1 "frodo" 2 "apeach" 0 "neo" 2 위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.
유저 ID유저가 신고한 ID정지된 ID"muzi" ["frodo", "neo"] ["frodo", "neo"] "frodo" ["neo"] ["neo"] "apeach" ["muzi", "frodo"] ["frodo"] "neo" 없음 없음 따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.
이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.
문제풀이
- 객체 또는 map으로 신고당한 횟수를 저장한다.
- 사람을 기준으로 신고한 사람이 k번 신고 당했는지 확인한다.
- id_list를 map 메서드를 이용해서 횟수를 센다.
function solution(id_list, report, k) { let count = {} const list = [...new Set(report)].map(v=>v.split(' ')) list.forEach(v=>{ count[v[1]] = count[v[1]]+1 || 1 }) // console.log(count) let succeed = {} list.forEach(v=>{ succeed[v[0]] = count[v[1]]>=k?succeed[v[0]]+1||1 : succeed[v[0]] // console.log(succeed) }) return id_list.map(v=>succeed[v]||0) }
성격 유형 검사하기
문제 설명나만의 카카오 성격 유형 검사지를 만들려고 합니다.
지표 번호성격 유형
성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.1번 지표 라이언형(R), 튜브형(T) 2번 지표 콘형(C), 프로도형(F) 3번 지표 제이지형(J), 무지형(M) 4번 지표 어피치형(A), 네오형(N) 4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.
검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.
문제풀이
- count 객체를 생성한 후 점수를 저장한다.
- survey를 for문으로 돌면서 split한 것을 a,b로 저장한다.
- choice 원소를 4를 기준으로 적은지 큰지에 따라 점수를 계산한다.
이때 1 = 3점 3 = 1점이라는 것을 기억하고 Math.abs(choices[i]-4)를 하면 더욱 간결하고 좋다.
- count의 크기 비교를 통해 answer를 완성한다.
function solution(survey, choices) { var answer = ''; let count = {R:0,T:0,C:0,F:0,J:0,M:0,A:0,N:0} for(let i=0;i<survey.length;i++){ const [a,b] = survey[i].split('') if(choices[i]<4) { if (choices[i]===1)count[a]+=3 else if (choices[i]===3)count[a]+=1 else count[a]+=choices[i] } if(choices[i]>4) count[b]+=(choices[i]-4) } answer+= count['T']>count['R']? "T" : "R" answer+= count['F']>count['C']? "F" : "C" answer+= count['M']>count['J']? "M" : "J" answer+= count['N']>count['A']? "N" : "A" return answer; }
'알고리즘 > 코딩 테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 javascript 2단계 - 숫자의 표현,N개의 최소 공배수 ,점프와 순간이동,멀리뛰기,H-index,가장 큰 수 (0) 2023.02.08 [코딩테스트] 프로그래머스 javascript 2단계 - 올바른 괄호,괄호 회전하기 (0) 2023.02.08 [코딩테스트] Softeer javascript - 금고털이, 장애물 인식 프로그램, 지도 자동구축, 전광판 (0) 2023.02.03 [코딩테스트 javascript] 구명보트 - Greedy ,그리디, 탐욕 (0) 2023.02.02 [코딩테스트 javascript] 큰 수 만들기 - Greedy ,그리디, 탐욕 (0) 2023.02.02