티스토리 뷰
수평 직선에 탑 N대를 세웠습니다. 모든 탑의 꼭대기에는 신호를 송/수신하는 장치를 설치했습니다. 발사한 신호는 신호를 보낸 탑보다 높은 탑에서만 수신합니다. 또한, 한 번 수신된 신호는 다른 탑으로 송신되지 않습니다.
예를 들어 높이가 6, 9, 5, 7, 4인 다섯 탑이 왼쪽으로 동시에 레이저 신호를 발사합니다. 그러면, 탑은 다음과 같이 신호를 주고받습니다. 높이가 4인 다섯 번째 탑에서 발사한 신호는 높이가 7인 네 번째 탑이 수신하고, 높이가 7인 네 번째 탑의 신호는 높이가 9인 두 번째 탑이, 높이가 5인 세 번째 탑의 신호도 높이가 9인 두 번째 탑이 수신합니다. 높이가 9인 두 번째 탑과 높이가 6인 첫 번째 탑이 보낸 레이저 신호는 어떤 탑에서도 수신할 수 없습니다.
맨 왼쪽부터 순서대로 탑의 높이를 담은 배열 heights가 매개변수로 주어질 때 각 탑이 쏜 신호를 어느 탑에서 받았는지 기록한 배열을 return 하도록 solution 함수를 작성해주세요.
풀이
function solution(heights) {
var answer = [];
for(let i = heights.length - 1; i > 0; i--) {
for(let j = i - 1; j >= 0; j--) {
if(heights[j] > heights[i]) {
answer.push(j+1);
break;
}
if(j == 0) {
answer.push(0)
}
}
}
answer.push(0);
return answer.reverse();
}
1. 왼쪽으로 레이저를 송신하기 때문에, for문을 뒤부터 돌림
2. 왼쪽의 탑과 비교를 해야하므로 이중으로 for문을 돌림
3. 이때 왼쪽이 오른쪽보다 높은 경우, 배열에 왼쪽탑의 순서(인덱스에 1을 더한 값)을 푸시하고 break로 빠져나옴
4. 만약 j가 0인경우, 높은 탑을 찾지 못한 것이므로 0을 푸시함
5. 맨 왼쪽 탑은 항상 더 높은 탑이 없으므로 0을 푸시함
6. 오른쪽→왼쪽으로 통신을 했으므로 push한 반대 순서대로 보여야해서 reverse()로 뒤집고 리턴
다른 사람의 풀이
function solution(heights) {
return heights.map((v, i) => {
while (i) {
i--;
if (heights[i] > v) {
return i + 1;
}
}
return 0;
});
}
이중 for문 없이 map과 while 문으로 깔끔하게 끝냈음..!
while문을 돌며 큰 탑이 나오면 탑의 위치를 리턴하고, 그렇지 않으면 0을 리턴했구나
'1Day 1Algorithm' 카테고리의 다른 글
[DAY 5] 프로그래머스 : 콜라츠 추측 (0) | 2020.05.22 |
---|---|
[DAY 4] 프로그래머스 : 자릿수 더하기 (0) | 2020.05.22 |
[DAY 3] 프로그래머스 : 짝수와 홀수, 하샤드 수 (0) | 2020.05.21 |
[DAY 2] 프로그래머스 : 문자열 내림차순으로 배치하기 (0) | 2020.05.20 |
[DAY 1] 프로그래머스 : 평균 구하기 (0) | 2020.05.19 |
- Total
- Today
- Yesterday
- 알고리즘
- js
- Typescript
- sort
- Algorithm
- 배열
- redux-saga
- React
- 우아한테크러닝
- sort()
- 타입스크립트
- 배치처리시스템
- 리액트
- 구간합
- reduce()
- 컴퓨터공학
- 프로그래머스
- 1day1algorithm
- 자료구조
- 멀티프로그래밍
- 자바스크립트
- Array
- Props
- javascript
- OS
- 시분할시스템
- 웹팩
- 운영체제
- greedyAlgorithm
- Webpack
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |