IF문 좀 대신 써줘

시간초과 코드

from sys import stdin

N, M = map(int, stdin.readline().strip().split())

powers = []
titles = []

for _ in range(N):
    title, power = map(str, stdin.readline().strip().split())
    power = int(power)
    powers.append(power)
    titles.append(title)

for _ in range(M):
    userPower = int(stdin.readline().strip())
    for idx in range(len(powers)):
        if userPower <= powers[idx]:
            print(titles[idx])
            break

 

성공 코드

from sys import stdin

N, M = map(int, stdin.readline().strip().split())

powers = []

for _ in range(N):
    title, power = map(str, stdin.readline().strip().split())
    powers.append([title, int(power)])


powers.sort(key=lambda x: x[1]) # 오름차순 정렬

for _ in range(M):
    power = int(stdin.readline().strip())
    start = 0
    end = len(powers)-1

    while start <= end:
        mid = (start+end) // 2
        if power > powers[mid][1]:
            start = mid + 1
        else:
            end = mid - 1

    print(powers[start][0])
728x90

타노스

 

내코드

from sys import stdin

# 사전순 가장 빠른 것을 출력해야 하기 때문에
# 1은 왼쪽에서 부터 삭제, 0은 오른쪽에서부터 삭제
s = stdin.readline().strip()

count0 = s.count("0")//2
count1 = s.count("1")//2

while count0 > 0 or count1 > 0:
    if count1 > 0:
        idx1 = s.index("1")
        s = list(s)
        s[idx1] = ''
        s = "".join(s)
        count1 -= 1
    if count0 > 0:
        idx0 = s.rindex("0")
        s = list(s)
        s[idx0] = ''
        s = "".join(s)
        count0 -= 1

print("".join(s))
728x90

Numpy

Numpy는 수치해석, 통계관련 기능을 제공하는 Python 라이브러리이다.

 

용어

  • Axis: 배열의 각 축을 의미
    • 2차원에서 axis0은 열방향( ⬇️ ), axis1은 행방향을 의미( ➡️ )
  • Rank: 축의 개수 (차원), ex)  1차원, 2차원, 3차원 ...
  • Shape: 축의 개수

라이브러리 불러오기

  1. 별칭 없이 라이브러리 불러오기
  2. 별칭을 주고 라이브러리 불러오기
  3. 특정 함수만 불러오기
# 별칭 없이 라이브러리 불러오기
import numpy

a = numpy.array([1,2])

# 별칭 주고 라이브러리 불러오기
import numpy as np
a = np.array([1,2])

# 특정 함수만 불러오기
from numpy import array
a = array([1,2])

 

배열 만들기 numpy.array(리스트)

1차원 배열

# 라이브러리 
import numpy as np

# 1차원 배열 생성
a = np.array([1,2,3])

# 차원
print(a.ndim) # 1

# 모양
print(a.shape) # (3, ) 원소 3개인 1차원 배열

# 데이터 형식
print(a.dtype) # int

# 배열 원소 조회
print(a[0], a[1], a[2]) # 1 2 3

 

2차원 배열

# 라이브러리 
import numpy as np

# 1차원 배열 생성
a = np.array([[1,2,3],
			[4,5,6],
            [7,8,9]])

# 차원
print(a.ndim) # 2

# 모양
print(a.shape) # (3, 2) 원소 3개인 2차원 배열

# 데이터 형식
print(a.dtype) # int

# 배열 원소 조회
print(a[0][0], a[1][1], a[2][2]) # 1 5 9

 

 

3차원 배열

# 라이브러리 
import numpy as np

# 1차원 배열 생성
a = np.array([
    [[1,2,],[3,4]],
    [[5,6],[7,8]]
])

# 차원
print(a.ndim) # 3

# 모양
print(a.shape) # (2, 2, 2) (2,2) 크기의 2차원 배열이 2개

# 데이터 형식
print(a.dtype) # int

# 배열 원소 조회
print(a[0][0], a[1][1]) # [1 2] [7 8]

 

Axis0 의 의미

  • 데이터의 건수를 의미한다.

2차원 데이터의 Shape가 (200, 4) 이라고 가정해보자. 이때 의미는 컬럼이 4개인 데이터가 100개 있다는 의미이다.

코드로 작성해서 확인해보면 다음과 같다.

# 라이브러리 
import numpy as np

a0 = ['Kim', 20, 201324, 'A']
student = np.array([a0] * 100)
print(student.shape) # (100, 4)
print(student.ndim) # 2

 

a0 은 학생a의 이름, 나이, 학번, 성적 정보를 가지고 있는 리스트이다.

해당 리스트를 np.array() 메소드를 통해서 100개의 데이터를 배열로 만드는 코드이다.

shape를 확인해보면 4개의 컬럼으로 이루어진 100개의 데이터다! 라는 것을 확인할 수 있고, ndim (차수)가 2차원 인것을 확인할 수 있다.

 

Reshape

기존 배열의 Shape를 새로운 형태의 배열로 재구성하는 함수

배열.reshape(행, 열)

np.reshape(배열, 행, 열)

  • array.reshape(3, -1) # array를 3행으로 된 배열로 변환
  • array.resahpe(-1, 3) # array를 3열로 된 배열로 변환
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)
print(array_a)
# [[ 1  2  3]
#  [ 4  5  6]
#  [ 7  8  9]
#  [10 11 12]]
print(array_a.shape) # (4, 3)

array_a = array_a.reshape(12, )
print(array_a)
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
print(array_a.shape) # (12, )

array_a = array_a.reshape(6, -1)
print(array_a)
# [[ 1  2]
#  [ 3  4]
#  [ 5  6]
#  [ 7  8]
#  [ 9 10]
#  [11 12]]
print(array_a.shape) # (6, 2)


array_a = array_a.reshape(-1, 6)
print(array_a)
# [[ 1  2  3  4  5  6]
#  [ 7  8  9 10 11 12]]
print(array_a.shape) # (2, 6)

 

배열 데이터 조회 

인덱싱

요소 조회

  • 배열[행인덱스, 열인덱스]
  • 배열[행인덱스][열인덱스]

행 조회

  • 배열[행 인덱스. :]
  • 배열[행 인덱스]
  • 배열[[행1, 행2]]
  • 배열[[행1, 행2], :]

 

요소 조회 예제 코드

import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)

print(array_a[0,0]) # 1
print(array_a[0][0]) # 1

 

행 조회 예제 코드

import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)

print(array_a[0, :]) # [1 2 3]
print(array_a[1]) # [4 5 6]
print(array_a[[0,1]]) # [[1 2 3] [4 5 6]]
print(array_a[[0,1], :]) # [[1 2 3] [4 5 6]]

 

 

슬라이싱

  • 배열[시작:끝]
  • 배열[행인덱스, 시작:끝]
  • 배열[시작:끝, 시작:끝]
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)

print(array_a[0:2]) # [[1 2 3] [4 5 6]]
print(array_a[0, 0:2]) # [1 2] 
print(array_a[0:2, 0:2]) # [[1 2] [4 5]]

 

 

집계 함수

sum(), mean(), std() 모두 옵션없이 사용하면, 전체 데이터에 대한 집계가 계산된다.

  • numpy.sum() : 합계
  • numpy.mean() : 평균
  • numpy.std() : 표준편차

 

option

  • axis = 0 : 행 방향 집계
  • axis = 1 : 열 방향 집계
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
array_a = np.array(list_a)

# no option

# numpy.sum()
# 함수로서 사용
print(np.sum(array_a)) # 78
# 메소드로서 사용
print(array_a.sum()) # 78

# numpy.mean()
# 함수로서 사용
print(np.mean(array_a)) # 6.5
# 메소드로서 사용
print(array_a.mean()) # 6.5

# numpy.std()
# 함수로서 사용
print(np.std(array_a)) # 3.452052529534663
# 메소드로서 사용
print(array_a.std()) # 3.452052529534663

# axis=0
# numpy.sum()
print(array_a.sum(axis=0)) # [22 26 30]

# numpy.mean()
print(array_a.mean(axis=0)) # [5.5 6.5 7.5]

# numpy.std()
print(array_a.std(axis=0)) # [3.35410197 3.35410197 3.35410197]


# axis=1
# numpy.sum()
print(array_a.sum(axis=1)) # [ 6 15 24 33]

# numpy.mean()
print(array_a.mean(axis=1)) #  2.  5.  8. 11.]

# numpy.std()
print(array_a.std(axis=1)) # [0.81649658 0.81649658 0.81649658 0.81649658]

 

가장 큰(작은) 값의 인덱스 반환 

  • numpy.argmax(array, axis)
  • numpy.argmin(array, axis)
  • axis 생략: 전체 데이터
  • axis 0 : 열 기준 큰 값
  • axis 1 : 행 기준 큰 값
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
array_a = np.array(list_a)

# 전체 데이터 중 큰 값 인덱스 조회
print(np.argmax(array_a)) # 11

# axis = 0
# 열 별로 가장 큰 값의 인덱스 조회
print(np.argmax(array_a, axis=0)) # [3 3 3]

# axis = 1
# 행 별로 가장 큰 값의 인덱스 조회
print(np.argmax(array_a, axis=1)) # [2 2 2 2]

# 전체 데이터 중 작은 값 인덱스 조회
print(np.argmin(array_a)) # 0

# axis = 0
# 열 별로 가장 작은 값의 인덱스 조회
print(np.argmin(array_a, axis=0)) # [0 0 0]

# axis = 1
# 행 별로 가장 작은 값의 인덱스 조회
print(np.argmin(array_a, axis=1)) # [0 0 0 0]

 

조건에 따라 값 지정하기 :: numpy.where

numpy.where(조건문, 참일 때 값, 거짓일 때 값)

import numpy as np

list_a = [1,2,3,4,5,6,7]
array_a = np.array(list_a)

array_a = np.where(array_a < 4, 1, 0)
print(array_a) # [1 1 1 0 0 0 0]
728x90

'Language > Python' 카테고리의 다른 글

[Pandas] 시계열 데이터 처리  (0) 2024.03.01
[Pandas] 데이터분석을 위한 데이터 전처리  (2) 2024.03.01
[Pandas] Pandas 기초  (0) 2024.03.01
[Python] List, Dictionary  (0) 2024.02.28
  • 목차
    • List
    • Dictionar

List

[생성]

1. 대괄호

# list_name = [?, ?, ?] 방식으로 선언
# ex)
a = [1,2,3] # 원소로 숫자만
b = [1,"2",3] # 원소로 숫자 + 문자형

 

2. range() 함수

2-1. range(2): 0~1까지

a = list(range(2))
print(a) # [0, 1]

 

2-2. range(1, 5): 1~4까지

a = list(range(1, 3))
print(a) # [1, 2]

 

2-3. range(0,7,2): 0부터 6까지 2씩 증가

a = list(range(0, 7, 2))
print(a) # [0, 2, 4, 6]

 

 

[조회]

1. 인덱스 조회

# 조회는 index로 조회한다.
# index는 0부터 시작
a = [1,2,3]
print(a[0]) # 1
print(a[1]) # 2
print(a[2]) # 3
print(a[3]) # error
print(a[-1]) # 3

 

2. 인덱스 범위 조회

리스트 이름[시작 인덱스 : 끝 인덱스]

시작 인덱스는 포함하고, 끝 인덱스전까지 조회한다.

시작 인덱스 생략: 0번 인덱스 부터

끝 인덱스 생략: 마지막 인덱스 까지

a = [1,2,3,4,5]
print(a[:]) # [1,2,3,4,5]
print(a[:-2]) # [1,2,3]
print(a[2:-2]) # [3]

 

[수정]

1. 값 추가 (append, extend, insert)

1. append(value)

리스트의 제일 끝에 값을 추가

# 값 한개 추가
a = [1,2,3,5]
print(a) # [1,2,3,5]

# 리스트에 리스트 추가
a.append([7,8,9])
print(a) # [1,2,3,5,6,[7,8,9]]

 

2. extend(list)

리스트에 다른 리스트의 원소를 모두 이어붙이고 싶을 때

a = [1,2,3]
b = [4,5,6]

a.extend(b)
print(a) # [1,2,3,4,5,6]

 

3. insert(index, value)

원하는 위치에 특정 값 넣기

리스트이름.insert(index, value)

a = [1,2,4,5,6,7]
a.insert(2,3)
print(a) # [1,2,3,4,5,6,7]

2. 값 수정

리스트이름[수정하고싶은 인덱스] = 수정할 값

a = [1,2,4]
print(a) # [1,2,4]

a[2] = 3
print(a) # [1,2,3]

 

3. 값 삭제(del, pop)

1. del list[index]

del 리스트이름[index]

원하는 인덱스 값을 리스트에서 삭제

a = [1,2,3,4,5]
print(a) # [1,2,3,4,5]

del a[3]
print(a) # [1,2,3,5]

 

2. pop(index)

리스트이름.pop(index)

원하는 인덱스 위치의 값을 삭제

a = [1,2,3,3,4,5]
print(a) # [1,2,3,3,4,5]

a.pop(2)
print(a) # [1,2,3,4,5]

 

 

2. remove(value)

특정 값을 리스트에서 삭제

중복되는 값이 있는 경우 더 앞에 있는 값을 삭제

a = [1,2,3,4,3,5]
a.remove(3)
print(a) # [1,2,4,3,5]

Dictionary

[생성]

Dictionary는 key와 value의 쌍으로 이루어져 있다.

생성시 리스트와 다르게 { } 중괄호를 사용한다.

 

# dict = {"key" : "value}
student = {"James": 20, "Kevin": 21} # key: 문자열, value: 숫자
print(student) # {'James': 20, 'Kevin': 21}

score = {30242: 100, 324215: 90} # 학번 : 성적 -> key: 숫자, value: 숫자
print(score) # {30242: 100, 324215: 90}

 

[조회]

조회할때는 key를 이용하여 조회한다.

dictionary['key']

student = {"James": 20, "Kevin": 21} 
print(student["James"]) # 20

 

 

[수정]

1. 값 추가/수정

리스트 값 수정하는 것과 비슷하다. 대괄호안에 인덱스 대신 key를 넣어주면 된다.

dictionary["key"] = new_value 

student = {"James": 20, "Kevin": 21}
student["James"] = 22
print(student["James"]) # 22

 

3. 값 삭제

리스트 요소 삭제의 del과 문법이 동일하다.

del dictionary['key'] 

student = {"James": 20, "Kevin": 21}
del student["Kevin"]
print(student) # {"James": 20 }
728x90

'Language > Python' 카테고리의 다른 글

[Pandas] 시계열 데이터 처리  (0) 2024.03.01
[Pandas] 데이터분석을 위한 데이터 전처리  (2) 2024.03.01
[Pandas] Pandas 기초  (0) 2024.03.01
[Numpy] Numpy 기초  (0) 2024.02.29

+ Recent posts