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

프로그래머스 기능개발 python

by 지기_ 2021. 6. 10.
반응형

1.문제

 

2. 설계

 

3. 알고리즘

 

4. 구현

총체적 난국.. 진짜 한동안 안했더니 왜 이렇게 되는 지 이해하는 데에 한참 걸렸다.

그래도 깔끔하게 이해하고 나니 내가 어떤 부분의 코딩을 잘못하고 있는 지 명확하게 이해했다.

 

통과답

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

 

import queue

def solution(progresses, speeds):
    answer = []
    tmp_list = []
    q = queue.Queue()
    for i in range(len(progresses)):
        if((100-progresses[i])%speeds[i]):
            tmp_list.append((100-progresses[i])//speeds[i]+1)    
        else:
            tmp_list.append((100-progresses[i])//speeds[i])
    print(tmp_list)
    cnt=1
    p_cnt=0
    for i in range(len(progresses)):
        print("i: ",i)
        for j in range(i+1,len(progresses)):
            print("j: ",j)
            if(tmp_list[i]>=tmp_list[j]):
                cnt+=1
            else:
                answer.append(cnt)
                i=j
                cnt=1
                break
        print("answer: ", answer)
    return answer

일단 위의 코드는 괜찮은데 아래는 여러 문제가 있다.

1. i=j 가 반영되지 않는다. 그래서 i를 건너뛰지 않고 모두 보기 때문에 이상하게 쌓이고 있다.

이건 cpp이랑 다른 부분인 것 같고 굉장히 흥미로운 python만의 특징인 것 같다.

어떻게 이럴 수 있는 지 모르겠는데,

 

cpp에서는 i+=j를 해주면 i가 이렇게 훅 점프를 한다.

#include <bits/stdc++.h>
using namespace std;

int main() {
	for(int i=0; i<10; i++){
		cout<<"i: "<<i<<'\n';
		for (int j=0; j<10; j++){
			cout<<"j: "<<j<<'\n';
			if(j==3){
				i+=j;
				break;
			}
		}
	}
	return 0;
}

Success #stdin #stdout 0s 5456KB
i: 0
j: 0
j: 1
j: 2
j: 3
i: 4
j: 0
j: 1
j: 2
j: 3
i: 8
j: 0
j: 1
j: 2
j: 3

 

반면에 python으로 다음과 같은 코드를 짜면 i가 i+=j를 무시하고 계속 1씩 더해나간다.

아마도 for i range(10)을 하면 i가 붙어있는 list를 순서대로 참조하게 하는 것 같다.

주의해서 사용하기

# your code goes here
 
for i in range(10):
	print("i: ", i)
	for j in range(10):
		print("j: ", j)
		if j==3:
			i= (i+j)
			break
i:  0
j:  0
j:  1
j:  2
j:  3
i:  1
j:  0
j:  1
j:  2
j:  3
i:  2
j:  0
j:  1
j:  2
j:  3
i:  3
j:  0
j:  1
j:  2
j:  3
i:  4
j:  0
j:  1
j:  2
j:  3
i:  5
j:  0
j:  1
j:  2
j:  3
i:  6
j:  0
j:  1
j:  2
j:  3
i:  7
j:  0
j:  1
j:  2
j:  3
i:  8
j:  0
j:  1
j:  2
j:  3
i:  9
j:  0
j:  1
j:  2
j:  3

* 알게된 것

python 올림, 내림 ,반올림

 

올림
>>> import math #math 모듈을 먼저 import해야 한다.
>>> math.ceil(-3.14)    #결과는 -3
>>> math.ceil(3.14) #결과는 4

내림
>>> import math
>>> math.floor(3.14)    #결과는 3
>>> math.floor(-3.14)   #결과는 -4
int-> 0으로 가는 방향
>>> int(-3.14)  #결과는 -3 => 0으로 가는 방향 선택

반올림
파이썬에 내장된 round() 함수를 사용한다.
>>> round(3.1415)   #결과는 3

 

* 알게된 것2

python stack, queue 사용하기

 

스택
pancakeStack.append('Pancake #1')
pancakeStack.pop()

큐
ticket_queue.append('Customer #3')
ticket_queue.pop(0)

1. 길이 구하기
len(li) #3

2. 아이템 x와 매치되는 요소 개수 카운트하기
li.count('Pancake #1') #1

3. 스택/큐에 아이템 추가하기
li.extend(li2)

4. 스택/큐 뒤집기 (reverse)
li.reverse()

맨 끝의 엘리먼트 n개를 맨 처음으로 옮기기
.rotate(n) : n은 맨 끝 엘리먼트 몇 개를 옮길지 결정 
li = deque()
li.rotate(1)# deque(['Pancake #1', 'Pancake #2', 'Pancake #3']) >> deque(['Pancake #3', 'Pancake #1', 'Pancake #2'])
li.rotate(2)# deque(['Pancake #1', 'Pancake #2', 'Pancake #3']) >> deque(['Pancake #2', 'Pancake #3', 'Pancake #1'])

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글