[Python, Java] 큐_기능개발 복습

EunBi Na·2022년 6월 22일
0

고민) for문을 사용 vs while 문을 사용의 효율성 차이

문제풀이

파이썬

def solution(progresses, speeds):
    answer = []
    cnt =0 #세어지는 개수
    day = 0 #날짜
    
    for i in range(len(progresses)):
        for j in speeds:
            if (i[0] + j[0]*day) >= 100
                count += 1
            else
            
    return answer
def solution(progresses, speeds):
    answer = []
    
    while progresses:
        cnt = 0
        while progresses and progresses[0] > 100:
            cnt += 1
            progresses.pop(0)
            speeds.pop(0)
        
        progresses = [progresses[0] + speeds[0]*day] >=100 

오류 뜬 이유) SyntaxError,

while, if 문 뒤에 ":" 안넣음;, "else:" ":"

def solution(progresses, speeds):
    answer = []
    cnt = 0
    day = 0
    
    while len(progresses) > 0
        if (progresses[0] + speeds[0]*day) >= 100:
            progresses.pop(0)
            speeds.pop(0)
            cnt += 1
        else:
            if cnt > 0
                answer.append(cnt)
                cnt = 0
            day += 1
    answer.append(cnt)
    return answer

오류해결!

def solution(progresses, speeds):
    answer = []
    cnt = 0
    day = 0
    
    while len(progresses)> 0:
        if (progresses[0] + speeds[0]*day) >= 100:
            progresses.pop(0)
            speeds.pop(0)
            cnt += 1
        else:
            if cnt > 0:
                answer.append(cnt)
                cnt = 0
            day += 1
    answer.append(cnt)
    return answer

효율성 풀이

1순위)

def solution(progresses, speeds):

    answer = []
    time = 0
    count = 0
    while len(progresses)> 0:
        if (progresses[0] + time*speeds[0]) >= 100:
            progresses.pop(0)
            speeds.pop(0)
            count += 1
        else:
            if count > 0:
                answer.append(count)
                count = 0
            time += 1
    answer.append(count)
    return answer

2순위) 좀 더 효율성있게 바꿀 수 있을듯

def solution(progresses, speeds):
    #결과를 담을 리스트
    answer = []
    #작업 리스트가 빌 때까지 반복
    while progresses :
        #몇개의 기능이 배포되는지 저장 
        cnt = 0
        #작업 리스트가 남아있고 맨 앞의 작업의 진도가 100인 경우: 기능 배포 변수 증가. 해당 작업과 작업 속도를 리스트에서 제거
        while progresses and progresses[0] >= 100:
            cnt+=1
            progresses.pop(0)
            speeds.pop(0)

        # 작업 리스트의 진도를 증가
        progresses = [progresses[i]+speeds[i] for i in range(len(progresses))]

        #만약 오늘 기능이 배포되었다면 결과리스트에 추가
        if cnt:
            answer.append(cnt)
    
    return answer
import math

def solution(progresses, speeds):
    answer = []
    progress_day = [math.ceil((100 - x) / y) for x, y in zip(progresses, speeds)]
    count = 0
    for i in progress_day:
        if i > count:
            answer.append(1)
            count = i
        else:
            answer[-1] += 1

    return answer

배운것

링크텍스트

math 모듈(Math Module)

progress_day = [math.ceil((100 - x) / y) for x, y in zip(progresses, speeds)]

zip() 기본 문법

zip() 함수는 여러 개의 순회 가능한(iterable) 객체를 인자로 받고, 각 객체가 담고 있는 원소를 터플의 형태로 차례로 접근할 수 있는 반복자(iterator)를 반환합니다. 설명이 좀 어렵게 들릴 수도 있는데요. 간단한 예제를 보면 이해가 쉬우실 겁니다.

>>> numbers = [1, 2, 3]
>>> letters = ["A", "B", "C"]
>>> for pair in zip(numbers, letters):
...     print(pair)
...
(1, 'A')
(2, 'B')
(3, 'C')

마지막 값을 문자열 더하기 연산을 통해 계속해서 덧붙여준다.

answer[-1] += 1

오류

SyntaxError: invalid syntax 에러는 '파이썬(Python)에서는 쓰지 않는 문법'이라는 의미 입니다.

○ 원인 : 문법상 오류

○ 해결책 : 오류난 문법 위치를 찾아 수정해야 함.

 - print(  ) 함수에서 작은 따옴표를 넣었는지 확인
 - 연산시 등호를 사용했는지 확인 등
 

자바

import java.util.ArrayList;
import java.util.Arrays;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] dayOfend = new int[100];
        int day = -1;
        for(int i=0; i<progresses.length; i++) {
            while(progresses[i] + (day*speeds[i]) < 100) {
                day++;
            }
            dayOfend[day]++;
        }
        return Arrays.stream(dayOfend).filter(i -> i!=0).toArray();
    }
}

위의 코드는 람다식으로 풀이했다고 한다. 람다식을 배워 본 적이 없어 맨 밑의 return 부분을… 정확히 이해는 못하겠으나 dayOfend 배열 중 0이 아닌 것들만 배열로 반환하는 것 같다.

큐를 이용한 풀이

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Integer> q = new LinkedList<>();
        List<Integer> answerList = new ArrayList<>();

        for (int i = 0; i < speeds.length; i++) {
            double remain = (100 - progresses[i]) / (double) speeds[i];
            int date = (int) Math.ceil(remain);

            if (!q.isEmpty() && q.peek() < date) {
                answerList.add(q.size());
                q.clear();
            }

            q.offer(date);
        }

        answerList.add(q.size());

        int[] answer = new int[answerList.size()];

        for (int i = 0; i < answer.length; i++) {
            answer[i] = answerList.get(i);
        }

        return answer;
    }
}
profile
This is a velog that freely records the process I learn.

0개의 댓글