고민) 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,
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
progress_day = [math.ceil((100 - x) / y) for x, y in zip(progresses, speeds)]
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;
}
}