반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/161989
🐍파이썬
def solution(n, m, section):
answer = 0
while section:
e = section[0]
while section and e <= section[0] < e+m:
section.pop(0)
answer+=1
return answer
1️⃣ 변수 e에 section의 가장 첫번째 원소를 대입한다.
2️⃣ section리스트에 원소가 존재하고 있고 section[i]가 section[0]보다 같거나 크고 section[0]+m보다 작은 동안 리스트의 원소를 앞에서부터 제거한다.
3️⃣ 내부 while문을 한 번 돌 때마다 answer값을 증가시킨다.
4️⃣ while문이 모두 종료 시 최종적으로 answer값을 리턴한다.
ex) section = [2, 3, 6], m = 4
1️⃣ 첫번째 while문
e = 2
2 👉 section and 2 <= 2 < 6 ⭕ section = [3, 6]
3 👉 section and 2 <= 3 < 6 ⭕ section = [6]
6 👉 section and 2 <= 6 < 6 ❌ 다음 while문
answer = 1
2️⃣ 두번째 while문
e = 6
6 👉 section and 6 <= 6 < 10 ⭕ section = []
empty 👉 section and 6 <= empty < 10 ❌ while문 종료
answer = 2
다른 풀이 방법
from collections import deque
def solution(n, m, section):
answer = 0
section = deque(section)
while section:
start = section.popleft()
while section:
if section[0] >= start + m:
break
section.popleft()
answer += 1
return answer
pop(0)를 사용하는 대신 deque의 popleft()를 사용했다.(시간효율성↑)
🐥자바스크립트
function solution(n, m, section) {
var answer = 0;
while(section.length > 0){
e = section[0];
while(section.length > 0 && e <= section[0] && section[0] < e+m){
section.shift();
}
answer++;
}
return answer;
}
1️⃣ 변수 e에 section의 가장 첫번째 원소를 대입한다.
2️⃣ section리스트에 원소가 존재하고 있고 section[i]가 section[0]보다 같거나 크고 section[0]+m보다 작은 동안 리스트의 원소를 앞에서부터 제거한다.
3️⃣ 내부 while문을 한 번 돌 때마다 answer값을 증가시킨다.
4️⃣ while문이 모두 종료 시 최종적으로 answer값을 리턴한다.
ex) section = [2, 3, 6], m = 4
1️⃣ 첫번째 while문
e = 2
2 👉 section and 2 <= 2 < 6 ⭕ section = [3, 6]
3 👉 section and 2 <= 3 < 6 ⭕ section = [6]
6 👉 section and 2 <= 6 < 6 ❌ 다음 while문
answer = 1
2️⃣ 두번째 while문
e = 6
6 👉 section and 6 <= 6 < 10 ⭕ section = []
empty 👉 section and 6 <= empty < 10 ❌ while문 종료
answer = 2
다른 풀이 방법
function solution(n, m, section) {
let count = 0;
const arr = Array.from(Array(n+1).fill(null));
// n = 4, arr = [ null, null, null, null, null ]
section.forEach(el =>{
arr[el] = 1;
})
// section = [1, 2, 3, 4], arr = [ null, 1, 1, 1, 1 ]
section.forEach(el=>{
if(arr[el]){ //null이 아닌 원소만 처리
arr.fill(null, el, el+m); // fill(채울값, 시작인덱스, 끝인덱스)
count++;
}
})
return count;
}
추가
자바스크립트/파이썬 별로 조건설정하는 방식이 달라서 while문 내의 조건설정을 알맞게 하는 법을 찾는 데 시간이 많이 걸렸다.
1. 빈 배열 체크
🐍 파이썬
🐥자바스크립트while(section) #section 내 원소가 존재하면 true, 원소가 없으면 false
2. a <= x < b// while(section) 동작하지 않는 코드 while(section.length > 0) //배열 길이를 이용해 빈배열 체크. 정상동작하는 코드
🐍 파이썬
e <= section[0] < e+m #문제없이 동작한다.
🐥자바스크립트
// e <= section[0] < e+m 동작하지 않는 코드 e <= section[0] && section[0] < e+m //이렇게 수정해야 한다.
반응형
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스 | 파이썬 / 자바스크립트] 평행(코딩테스트 입문 / level 0) (0) | 2023.03.16 |
---|---|
[프로그래머스 | 파이썬 / 자바스크립트] 다리를 지나는 트럭(스택/큐 / level 2) (0) | 2023.03.16 |
[프로그래머스 | 파이썬 / 자바스크립트] [3차] 파일명 정렬(2018 KAKAO BLIND RECRUITMENT / level 2) (0) | 2023.03.15 |
[프로그래머스 | 파이썬 / 자바스크립트] 겹치는 선분의 길이(코딩테스트 입문/ level 0) (0) | 2023.03.12 |
[프로그래머스 | 파이썬 / 자바스크립트] [3차] 압축(2018 KAKAO BLIND RECRUITMENT/ level 2) (2) | 2023.03.11 |
[프로그래머스 | 파이썬 / 자바스크립트] 롤케이크 자르기(연습문제/ level 2) (0) | 2023.03.11 |