티스토리 뷰
- 프로그래머스 코딩테스트 연습 2018 KAKAO BLIND RECRUITMENT Level 2 문제입니다.
나의 풀이
function solution(n, t, m, p) {
var answer = '';
p = p == m ? 0 : p; // 아래 로직에서 나머지와 비교하기 때문에 P가 m과 같으면 나머지가 0인경우 이므로 바꿔줌.
let cnt = 0; // 삽입된 문자열의 수 체크할 변수
let total = ''; // 진수변환 문자열
let num = 0;
while (total.length < m * t) {
total += num.toString(n);
num++;
}
for (let i = 0; i < total.length; i++) {
if (cnt == t) break;
if ((i + 1) % m == p) {
answer += total[i].toUpperCase();
cnt++;
}
}
return answer;
}
풀이 순서
- 진수변환한 문자열 값을 합친 값(total)이 m * t 보다 작을 때까지 [ 0 ~ ?? ] 까지 순서대로 진수변환을 하며 total에 문자열을 합쳐줍니다.
- m(게임에 참여한 인원 수) * t(미리 구할 숫자의 개수)
=> m명 중 p번째 순서로 숫자를 뽑을 때 t개를 뽑아 낼 수 있는 최소 범위의 길이
- m(게임에 참여한 인원 수) * t(미리 구할 숫자의 개수)
- 구한 total의 길이만큼 반복하며 (i+1) % m == p 인경우 answer에 추가해줍니다.
- i+1 을 하는 이유는 인덱스와 순서를 맞춰주기 위함입니다. ( 1 based 인덱스 )
- 순서p는 만일 p와 m(게임에 참여한 인원 수)가 같은 경우는 나머지가 0인 경우로 체크해줘야하기 때문에 맨 처음 p의 값을 체크하여 값을 재할당하는 로직을 추가했습니다.
- i+1 을 하는 이유는 인덱스와 순서를 맞춰주기 위함입니다. ( 1 based 인덱스 )
- 구해야할 t와 현재 추가된 cnt 값이 있으면 반복문을 종료합니다.
다른 사람의 풀이
function solution(n, t, m, p) {
var tubeT = Array.apply(null,Array(t)).map((a,i)=>i*m+p-1);
var line = '';
var max = m*t + p;
for (var i =0;line.length <= max; i++) {
line += i.toString(n);
}
return tubeT.map(a=>line[a]).join('').toUpperCase();
}
- tubeT는 순서p에 따라 뽑아야할 idx를 순차적으로 넣어놓은 배열입니다.
- line은 t개를 뽑아 낼 수 있는 최소 범위의 길이를 가진 진법변환 문자열입니다.
- tubeT의 idx에 해당하는 값을 뽑아와 문자열로 변환합니다.
- 차이점
- 나의 풀이
뽑아야할 idx를 배열로 구해놓지 않고 진법변환문자열의 인덱스를 조건검사하며 참인 경우 문자열을 뽑는 방법 - 다른 사람의 풀이
먼저 뽑아야할 idx를 구해놓고 진법변환문자열에서 미리 구해놓은 idx의 위치의 값들을 뽑는 방법
- 나의 풀이
나의 풀이와 다른 사람의 풀이와 비교해봤을 때 로직상 크게 다르지는 않지만 시간 복잡도와 쓸모없는 비교를 통한 메모리 낭비를 생각해보면 후자로 구현하는 것이 훨씬 효과적이다 ! 실제로 나의 풀이로는 9초에 통과한 케이스가 후자의 풀이로는 6초만에 통과했다. 아마 이 문제가 효율성 또한 체크하는 문제였으면 나는 통과하지 못했을 것 같다. 분발하자 ㅠㅠ
'Algorithm' 카테고리의 다른 글
[JS] [Programmers] 구명보트 (0) | 2022.06.20 |
---|---|
[JS] [Programmers] 삼각 달팽이 (0) | 2022.06.17 |
우선순위 큐 (Priority Queue) (1) | 2022.06.13 |
알고리즘 풀이에 도움되는 수학 정리 ! (0) | 2022.05.27 |
누적합(Prefix Sum / Cumulative Sum) 알고리즘 (0) | 2022.05.24 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- typescript
- redirects
- 자바스크립트 비동기 동작원리
- redux
- 1급 객체
- Next.js
- Virtual Scroll
- next.js에 .gitignore가 적용되지 않을 때
- 함수형 컴포넌트
- 렌더링 속도 개선
- 1급 함수
- debouncing
- 1급 시민
- React로 쓰로틀링 디바운싱 구현
- 호이스팅
- array
- programmers
- 목표 일기
- rewrites
- 매겨변수와 인자
- 시맨틱 웹
- useRef
- 자바스크립트 동작원리
- 타입스크립트
- next.js 환경변수
- 가상스크롤
- zustand
- javascript
- react
- vue
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함