본문 바로가기
Problem Solving/프로그래머스

[프로그래머스 | 파이썬 / 자바스크립트] 덧칠하기(연습문제 / level 2)

by 청량리 물냉면 2023. 3. 12.
반응형
문제

https://school.programmers.co.kr/learn/courses/30/lessons/161989

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🐍파이썬
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
🐥자바스크립트
// while(section) 동작하지 않는 코드
while(section.length > 0)	//배열 길이를 이용해 빈배열 체크. 정상동작하는 코드
2. a <= x < b
🐍 파이썬
e <= section[0] < e+m	#문제없이 동작한다.

🐥자바스크립트

// e <= section[0] < e+m 동작하지 않는 코드
e <= section[0] && section[0] < e+m	//이렇게 수정해야 한다.​

 

반응형