자료ꡬ쑰 및 μ‹€μŠ΅

자료ꡬ쑰 및 μ‹€μŠ΅ - [1] μ•Œκ³ λ¦¬μ¦˜ 뢄석 μ‹€μŠ΅λ¬Έμ œ (λ‚˜λ¨Έμ§€ μ—°μ‚°, λΉ„νŠΈν–‰λ ¬μ—μ„œ μ΅œλŒ€ 1ν–‰ μ°ΎκΈ°, λˆ„μ  평균) (3)

Mainyoung 2022. 1. 22. 16:12

문제 1 - λ‚˜λ¨Έμ§€ μ—°μ‚°

β€˜%’(modulo) μ—°μ‚°μžλŠ” λ‚˜λˆ—μ…ˆμ˜ λ‚˜λ¨Έμ§€λ₯Ό λ°˜ν™˜ν•œλ‹€. λ§μ…ˆκ³Ό λΊ„μ…ˆ μ—°μ‚°μžλ§Œμ„ μ‚¬μš©ν•˜μ—¬ aλ₯Ό b둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό λ°˜ν™˜ν•˜λŠ” modulo(a, b) ν•¨μˆ˜μ™€ 이λ₯Ό ν…ŒμŠ€νŠΈν•  ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 단, a β‰₯ 0, b > 0 μΈ μ •μˆ˜λ‹€.

 

β€» νžŒνŠΈ: modulo(a, b) ν•¨μˆ˜λŠ” O(a/b) μ‹œκ°„에 μ‹€ν–‰ν•˜λ„둝 μž‘μ„±ν•  μˆ˜ μžˆλ‹€.

 

#μž…λ ₯ μ˜ˆμ‹œ 1
>>> 17 3   // 17 % 3
2

#μž…λ ₯ μ˜ˆμ‹œ 2
>>> 6 3  // 6 % 3
0

#μž…λ ₯ μ˜ˆμ‹œ 3
>>> 0 5  // 0
0
def modulo(a,b):
  temp = True

  while temp:
    if a>=b:
      a=a-b
    else :
      temp = False   
  print(a)
  
a = int(input())
b = int(input())

modulo(a,b)

이게 κ·Έλƒ₯ μ§  μ½”λ“œμ˜€λŠ”λ° λΈ”λ‘œκ·Έμ— μ •λ¦¬ν•˜λ €κ³  λ³΄λ‹ˆ 'ꡳ이 ?'λΌλŠ” 생각이 λ“œλŠ” μ½”λ“œμ΄λ‹€...?

def modulo(a,b):
  while b<a: # λ‚˜λˆ„μ–΄ 질 수 μžˆλŠ”λŒ€λ‘œ (-κ°€ μ—¬λŸ¬λ²ˆμ΄λ©΄ λ‚˜λˆ—μ…ˆμ΄λ―€λ‘œ)
    if a>=b: # aμ—μ„œ bλ₯Ό λΊ„ 수 있으면
      a=a-b  #빼라
  print(a)
  
a = int(input())
b = int(input())

modulo(a,b)

μ½”λ“œκ°€ 더 κ°„κ²°ν•΄μ‘Œλ‹€! 


문제 2 - λΉ„νŠΈν–‰λ ¬μ—μ„œ μ΅œλŒ€ 1ν–‰ μ°ΎκΈ°

n Γ— n λΉ„νŠΈ ν–‰λ ¬ A의 각 행은 1κ³Ό 0으둜만 κ΅¬μ„±λ˜λ©°, A의 μ–΄λŠ ν–‰μ—μ„œλ‚˜ 1듀은 ν•΄λ‹Ή ν–‰μ˜ 0듀보닀 μ•žμ„œ λ‚˜μ˜¨λ‹€κ³  κ°€μ •.
 ν–‰λ ¬ Aλ₯Ό μž…λ ₯λ°›μ•„, κ°€μž₯ λ§Žμ€ 1을 ν¬ν•¨ν•˜λŠ” 행을 μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. κ·ΈλŸ¬ν•œ ν–‰μ΄ μ—¬λŸ¬ κ°œ μžˆμ„ κ²½μš° κ·Έ κ°€μš΄λ° κ°€μž₯ μž‘은 ν–‰ λ²ˆν˜Έλ₯Ό μ°Ύμ•„μ•Όν•œλ‹€.
#Slow version
def mostOnes(A,n): 
  row = 0 #행을 선택
  jmax = 0 # κ°€μž₯ λ§Žμ€ 1을 κ°€μ§„ ν–‰μ—μ„œ 1의 κ°―μˆ˜λŠ” λͺ‡μΈκ°€?

  for i in range(n-1): #ν–‰μ˜ 개수만큼 반볡
    j=0
    while((j<n) & (A[i][j]==1)): # jκ°€ μ—΄μ˜ κ°―μˆ˜λ³΄λ‹€ μž‘κ³ , μ›μ†Œκ°€ 1이면? 
      j=j+1 #j의 개수 μ—…λ°μ΄νŠΈ
    if j>jmax: # νƒμƒ‰ν–ˆλ˜ iμ—΄μ˜ 1의 κ°―μˆ˜κ°€  jmax보닀 크닀면
      row = i #row μ—…λ°μ΄νŠΈ
      jmax = j #1의 갯수 μ—…λ°μ΄νŠΈ

  print(row)
  

n = 8
A = [[1,1,1,1,0,0,0,0],[1,1,1,1,1,0,0,0],[1,0,0,0,0,0,0,0],[1,1,1,1,1,1,0,0],[1,1,1,1,0,0,0,0],[0,0,0,0,0,0,0,0],[1,1,1,1,1,1,1,0],[1,1,1,1,1,0,0,0]]

λ¨Όμ € O(n^2) 인 μ•Œκ³ λ¦¬μ¦˜μ„ λ¨Όμ € κ΅¬ν˜„ν–ˆλ‹€. forλ¬Έ 내에 while문이 μ‚½μž…λ˜μ–΄ 각 ν–‰μ˜ λͺ¨λ“  열을 νƒμƒ‰ν•˜κΈ° λ•Œλ¬Έμ— 2μ°¨μ‹œκ°„μ΄ μ†Œμš”λœλ‹€. 이λ₯Ό 그림으둜 ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

 

ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 같은 절차λ₯Ό 톡해 μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜λ©΄ O(n)인 μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

1. ν–‰λ ¬μ˜ μ’Œμƒ μ…€μ—μ„œ μΆœλ°œν•œλ‹€.
2. 0이 발견될 λ•ŒκΉŒμ§€ 행렬을 κ°€λ‘œμ§ˆλŸ¬ κ°„λ‹€.
3. 1이 발견될 λ•ŒκΉŒμ§€ 행렬을 λ‚΄λ €κ°„λ‹€.
4. λ§ˆμ§€λ§‰ ν–‰ λ˜λŠ” 열을 λ§Œλ‚  λ•ŒκΉŒμ§€ μœ„ 2, 3 단계λ₯Ό λ°˜λ³΅ν•œλ‹€.
5. 1을 κ°€μž₯ 많이 κ°€μ§„ 행은 κ°€λ‘œμ§€λ₯Έ λ§ˆμ§€λ§‰ 행이닀.

이λ₯Ό 그림으둜 ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

#μž…λ ₯ μ˜ˆμ‹œ
8 ↦ n = 8 (8 Γ— 8 ν–‰λ ¬)
1 1 1 1 0 0 0 0 ↦ 각 λΉ„νŠΈλŠ” 곡백으둜 ꡬ뢄
1 1 1 1 1 0 0 0
1 0 0 0 0 0 0 0
1 1 1 1 1 1 0 0
1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 0
1 1 1 1 1 0 0 0

#좜λ ₯ μ˜ˆμ‹œ 
6  // 1이 κ°€μž₯ λ§Žμ€ ν–‰ 번호 : 6
#Fast Version
def mostOnesFast(A,n):
  i=0 #ν–‰λ²ˆν˜Έ
  j=0 #μ—΄λ²ˆν˜Έ
  row=0 #μ΅œλŒ€ 1개수 ν–‰λ²ˆν˜Έ

  while((i<n)&(j<n)): # n x n ν–‰λ ¬μ—μ„œ ν–‰κ³Ό 열이 n보닀 μž‘μ„ λ•Œ
    if A[i][j] ==1: # λ§Œμ•½ ν•΄λ‹Ή μ›μ†Œκ°€ 1이면/
      j+=1 # μ—΄λ°©ν–₯으둜 1μΆ”κ°€
      row = i #ν–‰ μ—…λ°μ΄νŠΈ
    else:
      i +=1 #ν•΄λ‹Ή μ›μ†Œκ°€ 0이면 1ν–‰ μΆ”κ°€

  return row

i와 jλͺ¨λ‘ μ»€μ§€λŠ” μ„±ν–₯을 κ°€μ§€κ³  있고, 0을 λ§Œλ‚¬μ„ λ•Œ 행을 μΆ”κ°€ν•΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ λœλ‹€. 그러면 μžμ—°μŠ€λŸ½κ²Œ κ°€μž₯ 많이 ν¬ν•¨ν•˜κ³  μžˆλŠ” 행을 찾을 수 μžˆλ‹€.

 


문제 3 - λˆ„μ  평균

μ›μ‹œ λ°μ΄ν„°κ°’λ“€λ‘œ κ΅¬μ„±λœ λ°°μ—΄ X의 i-번째 λˆ„μ ν‰κ· (prefix average)μ΄λž€ X의 i-λ²ˆμ§Έμ— 이λ₯΄κΈ°κΉŒμ§€μ˜ (i + 1)개 μ›μ†Œλ“€μ˜ 평균이닀. 즉, A[i] = (X[0] + X[1] + … + X[i])/(i + 1) λˆ„μ ν‰κ· μ€ 경제, 톡계 λΆ„μ•Όμ—μ„œ 였λ₯΄λ‚΄λ¦Ό 변동을 μˆœν™”μ‹œν‚΄μœΌλ‘œμ¨ λŒ€λž΅μ  μΆ”μ„Έλ₯Ό μ–»μ–΄λ‚΄κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€. μΌλ‘€λ‘œ 뢀동산, 주식, νŽ€λ“œ 등에도 자주 ν™œμš©λœλ‹€.. 이 λ¬Έμ œλŠ” λ°°μ—΄ X의 λˆ„μ ν‰κ· (prefix average) λ°°μ—΄ Aλ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•˜κ³  ν…ŒμŠ€νŠΈν•˜λŠ”λ° κ΄€ν•œ 것이닀.

# Slow Version
def prefixAverages1(X,n):
  A = []
  for i in range(n):
    sum=0
    for j in range(i+1):
      sum = sum + X[j]
      avg = sum/(i+1)
    A.append(int(sum / (i+1)))

  return A
  
n=3
X = [5,1,9]

A = prefixAverages1(X,n)
print(A)

μœ„ ν•¨μˆ˜λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ i 번째 μ™ΈλΆ€ λ°˜λ³΅μ—μ„œλŠ”, λ°”λ‘œ μ „ i– 1번째 λ°˜λ³΅μ—μ„œ κ΅¬ν–ˆλ˜ [0 ~ i – 1]의 합에, i + 1 번째 μ›μ†Œ κ°’ ν•œ κ°œλ§Œμ„ 더해 ν˜„μž¬ 합을 μ–»μ–΄ 평균을 κ΅¬ν•œλ‹€. λ”°λΌμ„œ 이λ₯Ό μˆ˜μ •ν•˜μ—¬ μ΄μ „μ˜ i – 1λ²ˆμ§ΈκΉŒμ§€μ˜ 합을 λ³΄κ΄€ν•˜μ—¬λ‹€μŒ 반볡으둜 μ „λ‹¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ°˜λ³΅ν•œλ‹€λ©΄ ν˜„μž¬ 합을 κ΅¬ν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ„ 단좕할 수 μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. μ΄λ ‡κ²Œ 쀑간 합을 λ³΄κ΄€ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ•Œκ³ λ¦¬μ¦˜μ„ κ°œμ„ ν•œ ν•¨μˆ˜ prefixAverage2λŠ” λˆ„적평균값듀을 μ„ ν˜• μ‹œκ°„에 κ΅¬ν•  μˆ˜ μžˆκ²Œ λœλ‹€.

 

# Fast Version
def prefixAverages2(X,n):
  A = []
  sum=0
  for i in range(n): # μ›μ†Œκ°―μˆ˜λ§ŒνΌ λ°˜λ³΅ν•¨
    sum = sum + X[i]
    A.append(int(sum / (i+1)))

  return A
  
n=3
X = [5,1,9]

A = prefixAverages2(X,n)
print(A)
728x90