문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
첫 풀이
규칙을 찾아보고자 직접 나열해봤다.
// 1
// 1 2 2 2
// 1 2 3 2 2 3 3 3 3
// 1 2 3 4 2 2 3 4 3 3 3 4 4 4 4 4
// 1 2 3 4 5 2 2 3 4 5 3 3 3 4 5 4 4 4 4 5 5 5 5 5 5ㅊ
첫 번째는 1~n
두 번째는 2가 2개, 이후 숫자들 1개씩
세 번째는 3이 3개, 이후 숫자들 1개씩
네 번째는 4가 4개, 이후 숫자들 1개씩
…
function solution(n, left, right) {
let answer = [];
for(let i = 1; i <= n; i++) {
for(let j = i; j <= n; j++) {
answer.push(...new Array(i === j ? i : 1).fill(j));
}
}
return answer.slice(left, right + 1)
}
- answer 배열에 위의 규칙에 맞는 값들을 넣는다.
- left 부터 right +1 까지 slice 한 값을 반환한다.
제출하니 싹다 런타임 에러가 발생한다. (으악)
2, 3, 12~20 런타임 에러 발생
오늘도 어김없이 질문하기의 힘을 빌렸다
배열을 아예 싹다 만들면 안된다. 규칙을 파악하고, 필요한 부분만 만들어야 한다.
두 번째 풀이
function solution(n, left, right) {
let answer = [];
for(let i = parseInt(left / n) + 1; i <= parseInt(right / n) + 1; i++) {
for(let j = i; j <= n; j++) {
answer.push(...new Array(i === j ? i : 1).fill(j));
}
}
return answer.slice(left % n, answer.length - n + 1 + right % n);
}
left와 right가 각 해당하는 row, column을 구하고, 해당 줄의 배열만 구한다.
그리고 해당 left와 right가 각 줄의 몇 번째 인덱스인지 고려하여 배열을 자른다.
몇 번째 줄인지는 parseInt(left / n) 이고,
그 줄의 몇 번째 인덱스에 해당하는지는 left % n 로 구할 수 있다.
(숫자는 1부터 시작하므로, 첫 번째 for 문에서 + 1 해준다)
이렇게 하면 앞엔 맞는데, 여전히 뒤의 테스트는 런타임 에러로 실패한다.
15, 17~20 실패
세 번째 풀이
배열 범위를 left부터 right까지만 구해야 한다. 그러면 각 배열에 맞는 수를 어떻게 구할 수 있냐.
0 1 2 3 4 x
0 1 2 3 4 5
1 2 2 3 4 5
2 3 3 3 4 5
3 4 4 4 4 5
4 5 5 5 5 5
y
x, y표로 작성해서 살펴봤다. 그러니까
몫과 나머지 중 큰 값 + 1 을 하면 배열에 맞는 수가 된다. 그래서,
function solution(n, left, right) {
let answer = [];
for(let i = left; i <= right; i++) {
answer.push(Math.max(parseInt(i/n), i % n) + 1)
}
return answer;
}
끝! 어렵다 ...
'CS > 알고리즘' 카테고리의 다른 글
[230422] 소수 찾기 (0) | 2023.04.21 |
---|---|
[230421] 모의고사 (0) | 2023.04.21 |
[230421] 위장 (0) | 2023.04.21 |
[230420] 캐시 (0) | 2023.04.20 |
[230419] 괄호 회전하기 (0) | 2023.04.19 |