728x90

나의 풀이

import math

def solution(progresses, speeds):
  zipped = zip(progresses, speeds)
  days = [math.ceil((100-x)/y) for x, y in zipped]
  max_index = [0]
  ptr = 0
  answer = []
  for _ in range(len(days)):
    if days[max_index[-1]] >= days[ptr]:
      ptr +=1

    else:
      max_index.append(ptr)
      ptr +=1
    
  last_element = len(days)-max_index[-1]
  for x in range(len(max_index)-1):
    answer.append(max_index[x+1]-max_index[x])

  answer.append(last_element)

  return answer
import math
a = [933055]
b = [1305]
ab = zip(a, b)

[math.ceil((100-x)/y) for x,y in ab]
 
 

문제의 코드들...

- answer = list(map(lambda x,y: y-x, max_index)).append(last_element) 
=> lambda x,y: y-x 이거 자체가 틀림
- zip하지 않은 상태로 여러 개의 리스트를 list comprehension에 동시에 쓸 수 없나봐
- pop은 index를 파라미터로 갖는구나! 원소 그자체가 아니구.

 

모범 코드

1. math의 ceil을 사용하지 않음

def solution(progresses, speeds):
    Q=[]
    for p, s in zip(progresses, speeds):
        if len(Q)==0 or Q[-1][0]<-((p-100)//s):
            Q.append([-((p-100)//s),1])
        else:
            Q[-1][1]+=1
    return [q[1] for q in Q]

2. 군더더기 없이 담백하게 자료구조를 잘 녹여냄

def solution(progresses, speeds):
    print(progresses)
    print(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

 

728x90
728x90

 

Error를 막기 위해서는 리스트 형식 취해서 + 인덱스 활용
 
lst[-1:]
 
a = ['a','b','c']

print(a[-1]) #c
print(a[-1:]) #['c']

b = []

print(b[-1]) #error
print(b[-1:]) #[] 에러 없이 빈 리스트 반환
 
 

프로그래머스 '스택 큐' '같은 숫자는 싫어'
 
모범 풀이
def no_continuous(s):
    a = []
    for i in s:
        if a[-1:] == [i]: continue
        a.append(i)
    return a

나의 풀이

def solution(arr):
    answer = [-1]
    for i in arr:
        if i == answer[len(answer)-1]:
            continue
        else:
            answer.append(i)
    answer.pop(0)

    return answer​
728x90
728x90

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

 

프로그래머스

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

programmers.co.kr

문제 개요

  • 장르 별로 가장 많이 재생된 노래 2개씩 => 베스트 앨범
  • 곡의 고유번호는 genres의 index.

1. 장르 정렬: 곡수
2. 장르 내 곡 정렬: 재생량 / 같으면 고유번호 낮은 거 먼저.

입력 2개: 노래 장르 list, 노래별 재생횟수 list
return: 베스트앨범 내 노래 고유번호 list

 

코드

def solution(genres, plays):
  gen_type = set(genres)
  gen_dict = {hash(a):0 for a in gen_type} #dictionary comprehension
  
  genres = [hash(b) for b in genres] #list comprehension
  zipped = list(enumerate(list(zip(genres, plays)))) #enumerate 통해 index 반환
  
  for item in zipped:
    gen_dict[item[1][0]] += item[1][1]
  gen_dict = sorted(gen_dict.items(), key=lambda x : x[1], reverse=True) #how to sort dictionary #method 'sort' is not available
  gen_sort = [x for x in list(map(lambda x: x[0], gen_dict))] #곡 재생수가 가장 큰 순으로 장르 나열
  answer=[]
  for gen in gen_sort:
    a=[] #장르별 곡 리스트
    for zips in zipped:
      if zips[1][0]==gen:
        a.append(zips)
      else:
        continue
    a.sort(key=lambda x: x[1][1], reverse=True)
    answer+=[x for x in list(map(lambda x: x[0], a[:2]))]

  return answer

주요 도구

 

- 알고리즘: 해시(딕셔너리, 파이썬 hash 함수)

- dictionary comprehension: 딕셔너리 생성하여 각 장르를 key, 장르별 곡 재생수의 총합을 value로 정리함

- zip(리스트1, 리스트2)에 list를 한번 더 씌워야 함 => 각 튜플에도 다중 인덱스로 접근 가능

- index 정보를 반환해주는 enumerate에도 list를 한번 더 씌워야 함 => 마찬가지, 각 원소에 다중 인덱스로 접근 가능

- 기존에 value값이 0으로 저장된 딕셔너리에 [] 인덱스 통해 => 적절한 key값을 입력해줌

 

- 특정 기준으로 iterable 정렬하기: sorted & key & lambda의 조합! lambda 통해 iterable의 '각 원소'에 구체적으로 접근 가능.

- 딕셔너리 정렬: 메서드 sort 대신 함수 sorted, 단 .items() 메소드 붙여야 함!

- map & lambda 조합 역시 중요: 주어진 이터러블 '각 원소'에 '동시에' 특정 함수를 적용하고 싶을 때.

   map(함수, 이터러블) => map(lambda x: x~~, 이터러블)

   마찬가지 map 이후 list 한번 더 씌워야 함.

- continue는 for문 처음으로 다시 돌아가는 것 vs return은 for문을 포함하여 함수 전체를 종료시키는 것

- indentation 아주 중요함. 엄밀한 논리 & 초반에 정확한 설계

 

 

다른 사람의 모범 풀이

def solution(genres, plays):
    answer = []
    d = {e:[] for e in set(genres)}
    for e in zip(genres, plays, range(len(plays))):
        d[e[0]].append([e[1] , e[2]])
    genreSort =sorted(list(d.keys()), key= lambda x: sum( map(lambda y: y[0],d[x])), reverse = True)
    for g in genreSort:
        temp = [e[1] for e in sorted(d[g],key= lambda x: (x[0], -x[1]), reverse = True)]
        answer += temp[:min(len(temp),2)]
    return answer
def solution(genres, plays):
    answer = []
    dic = {}
    album_list = []
    for i in range(len(genres)):
        dic[genres[i]] = dic.get(genres[i], 0) + plays[i]
        album_list.append(album(genres[i], plays[i], i))

    dic = sorted(dic.items(), key=lambda dic:dic[1], reverse=True)
    album_list = sorted(album_list, reverse=True)



    while len(dic) > 0:
        play_genre = dic.pop(0)
        print(play_genre)
        cnt = 0;
        for ab in album_list:
            if play_genre[0] == ab.genre:
                answer.append(ab.track)
                cnt += 1
            if cnt == 2:
                break

    return answer

class album:
    def __init__(self, genre, play, track):
        self.genre = genre
        self.play = play
        self.track = track

    def __lt__(self, other):
        return self.play < other.play
    def __le__(self, other):
        return self.play <= other.play
    def __gt__(self, other):
        return self.play > other.play
    def __ge__(self, other):
        return self.play >= other.play
    def __eq__(self, other):
        return self.play == other.play
    def __ne__(self, other):
        return self.play != other.play
728x90
728x90

축? 차원? axis? dim? 비슷한 듯 달라서 자주 헷갈렸었다.

Numpy와 Tensorflow에서 자주 등장하는 axis, dim의 차이를 정리해보고자 한다.

특히 axis와 dim은 행렬의 연산(concat, stack, sum, max...)의 방향을 설정하는 데 사용되므로, 확실히 짚고 넘어가보자.

 

 axis (축) 

배열의 차원 연산 방향 설정 시, axis의 해석 적용 예시
1차원 축은 axis = 0 하나 뿐이다. (행과 열로 구분되지 않음) dim_1 = np.array([0,1,2])
2차원 axis = 0 : 행 방향 (y 방향, 세로 방향)
axis = 1 : 열 방향 (x 방향, 가로 방향)
dim_2 = np.array([[0,1,2],
                             [3,4,5]])
* shape가 (2,3)

dim_2.sum(aixs=0) = [0+3, 1+4, 2+5]
                               = [3,5,7] (행 방향으로 합)
dim_2.sum(aixs=1) = [0+1+2, 3+4+5]
                               = [3, 12] (열 방향으로 합)
3차원 axis = 0 : 너비 방향 (z 방향)
axis = 1 : 행 방향 (y 방향, 세로 방향)
axis = 2 : 열 방향 (x 방향, 가로 방향)
dim_3 = np.array([[[0,1,2],
                               [3,4,5]],

                               [6,7,8],
                               [9,10,11]]])
* shape가 (2,2,3)

dim_3.sum(aixs=0) = [[0+6, 1+7, 2+8],
                                   [3+9, 4+10, 5+11]]
                               
                                = [[6,8,10],
                                   [12,14,16]]
                                   (너비 방향으로 합)

* 4차원 이상이 되면, 더 이상 행렬 개념으로 이해할 수 없음.

* 주어진 배열의 차원이 무엇이냐에 따라 axis = 0, axis = 1, ...가 가리키는 방향이 달라진다 ! 상대적 개념.

* axis를 지정하지 않고 sum을 할 경우 모든 원소의 합이 계산된다.

 

+ 2차원 배열에 대한 axis 개념을 직관적으로 잘 표현한 도식이 있다.

이미지 출처: jalammar.github.io/visual-numpy/

+ 3차원 배열에 대한 axis 개념을 직관적으로 잘 표현한 도식이 있다.

이미지 출처:&nbsp;https://acdongpgm.tistory.com/140

 

참고 페이지: https://pybasall.tistory.com/129

 


 dim  

* 주의: dim이 dimension(=차원)의 준말이기는 하나, 이때 '차원'의 두 가지 해석에 유의해야 한다.

* dim은 특정 텐서의 속성이기도 하고, 연산 방향을 설정할 때 사용될 수도 있다.

'차원'의 두 가지 의미
벡터나 행렬의 '열' 개수 ex 1. [1,2,3]는 3차원 벡터이다.
ex 2. 이번에는 이진 분류가 아닌 칠진 분류 task이므로, 7차원 벡터로 반환해야 한다.
텐서가 존재하는 '축'의 개수
=> ①
ex 1. [0,1,2]는 1차원 텐서(벡터)이다.

ex 2. [[0,1,2],
          [3,4,5]] 는 2차원 텐서(행렬)이다.

ex 3. [[[0,1,2],
           [3,4,5]],
           [6,7,8],
           [9,10,11]]] 는 3차원 텐서(행렬)이다.

ex 4. 점은 1차원, 직선은 2차원, 정육면체는 3차원!

 

배열의 차원 연산 방향 설정 시, dim의 해석 => ②
1차원 축은 axis = 0 하나 뿐이다. (행과 열로 구분되지 않음)
2차원 dim = 0 : 행 방향 (y 방향, 세로 방향) (* dim= -2)
dim = 1 : 열 방향 (x 방향, 가로 방향) (* dim= -1)
3차원 dim = 0 : 행 방향 (y 방향, 세로 방향) (* dim= -3)
dim = 1 : 열 방향 (x 방향, 가로 방향) (* dim= -2)
dim = 2 : 너비 방향 (z 방향) (* dim= -1)

 

* dim은 주어진 배열의 차원이 무엇이든지 관계 없이 axis = 0, axis = 1, ...가 가리키는 방향이 동일하다.

  속상하게도 axis에서 정한 방향과 다른 부분이 있으니 헷갈리지 말 것!

  그러나 dim=-1, dim=2,.. 이 가리키는 방향은 상대적으로 바뀌게 된다.

 

 

참고 페이지: https://questionet.tistory.com/25

 

 

 


+ a:

len size ndim shape reshape flatten
파이썬 내장 함수 numpy.ndarray 객체의 메서드 (파이썬 list나 string에 사용 불가)

ndarray.XX
첫번째 차원(행)의 원소 개수 행렬의
전체 원소 개수
행렬
전체 차원(dim) 표시
행렬의 shape 출력 배열을
새로운 shape로 변경 (*가능한 조건일 때)
n차원 행렬을 1차월 행렬로 reshape하여 복사본 출력

 

+ 미니배치 처리할 때는: (너비 값 즉 배치 사이즈 , 행 개수, 열 개수) 순서.

 

 

참고 페이지: https://tae-hui.tistory.com/entry/Python-numpy-%EB%B0%B0%EC%97%B4-%ED%81%AC%EA%B8%B0-%ED%98%95%EC%83%81-%ED%99%95%EC%9D%B8shape-ndim-size

https://blog.naver.com/PostView.nhn?blogId=life4happy&logNo=222170909964 

728x90

'개발' 카테고리의 다른 글

colab에서 .py 실행하기  (0) 2022.07.10
728x90

런타임-런타임유형변경-GPU 설정 #GPU 사용하기

 

google drive를 mount하기

방법 1) 파일 폴더 - 우측의 구글 드라이브 아이콘 클릭 (Google Drive에 연결 클릭)

방법 2)

from google.colab import drive

drive.mount('/content/drive')

 

 

.py 파일 수정하기

왼쪽 디렉토리 목록에서 원하는 파일 더블클릭 - 파일 수정

 

.py 파일 실행하기

%cd /content/drive/Mydrive.... #파일이 위치한 경로로 변경
!python ____.py #특정 파일 실행

 

터미널 기본 명령어

ls 현재 디렉토리의 파일 목록 출력
cd 디렉토리를 이동
pwd 현재 경로를 보여줌
rm 파일이나 디렉토리 삭제
cp 파일이나 디렉토리 복사
mv 이름 변경 or 다른 디렉토리로 이동시킴
mkdir 새로운 디렉토리 생성
rmdir 디렉토리 삭제

 

https://www.youtube.com/watch?v=lGUVXXRlpyU&list=PLZjIfJn3RN8uuQcxfAKIrYOCXfcWCBXMC 

728x90

'개발' 카테고리의 다른 글

[Numpy, Tensorflow] axis, dim (shape, ndim, size...)  (0) 2022.07.23

+ Recent posts