본문 바로가기

STUDY

파이썬 스터디 1주차(백준, 캐글)

동아리 파이썬스터디를 위해서 공부한것 위주로 정리합니다.


https://www.acmicpc.net/problem/2884

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net

 

H, M = map(int,input().split())
if M >= 45 : 
    print(H, M-45)
else :
  if H > 0 :
    print(H-1, M+15)
  else : 
    print(23, M+15)

 

> 45분 일찍 맞추는 문제.

M이 45보다 큰 경우 그냥 빼주면 되지만, 45보다 작을 경우 H를 1빼주고 M에 15를 더해주어야 한다.

H가 0이면서 M이 45 미만인 경우에는 H를 23으로 지정해 주는것이 포인트.

> 프린트할때 값을 수정하지 않고 if를 활용해 값을 바꾼 뒤 프린트해주는 경우에는 원하는 값을 못 얻을 수도 있다..!

 

https://www.acmicpc.net/problem/1330

 

1330번: 두 수 비교하기

두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오.

www.acmicpc.net

A, B = map(int,input().split())
if A > B: 
  print(">")
if A < B: 
  print("<")
if A == B:
  print("==")

 

https://www.acmicpc.net/problem/11021

 

11021번: A+B - 7

각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.

www.acmicpc.net

T = int(input())

for i in range(T):
  A, B = map(int,input().split())
  print(f"Case #{i+1}: {A+B}")

 

> f-string 짱짱맨. format 많이 쓰시던데 저는 이게 너무 좋아요...

 

https://www.acmicpc.net/problem/15552

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

import sys

T = int(sys.stdin.readline())
count = 0
for i in range(T) : 
  a, b = map(int, sys.stdin.readline().split())
  print(a+b)
  count =+ 1
  if count == T :
    break

 

> 어떻게 하는지 몰라서 구글링해서 풀었다.

분명 같은 코드인데 코랩 상에서는 invalid literal for int() with base 10이라는 오류가 계속 뜨더라.

??? 싶어 파이참에 실행해 보니 아무 오류가 안뜬다... 백준에서도 정답이라고 해줬다.

이처럼 코랩에서는 오류가 나는 경우가 종종 있다더라.

 

https://www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

N = int(input())
n = N
count=0
while True : 
  total = (n//10) + (n%10)
  newtotal = ((n%10)*10) + (total%10)
  count = count+1
  if newtotal == N : 
    break
  n = newtotal
print(count)

 

> 잘 못쓰면 시간초과난다. 핵심은 "입력값을 바꾸지 않을 것"(가령 n=N이라고 n을 만들지 않고 N으로만 쓴다면 무한루프가 일어난다)과 "변수에 값을 제대로 할당해 줄 것"(if-break 뒤에 n을 쓴 이유)이다.

저게 없다면 초기의 n(N)값을 바탕으로 계속적으로 계산하는 매우 이상한 식이 되기 때문!

 

https://www.acmicpc.net/problem/10951

 

10951번: A+B - 4

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

while True:
  try:
    A, B = map(int, input().split())
    print(A+B)
  except:
    break

 

> 아무 생각없이 While True 썼다가 아? 싶었다. 테스트 케이스 개수가 정해져 있지 않기 때문. 그래서 구글링했다.

테스트케이스가 정해져 있지 않은 경우에는 try, except를 사용한다. try에 해당하는 경우가 아니라면 except문이 작동하는 구조.


(보충학습) : 멘토님이 시키셨다 야호 !! ^-ㅠ

sys.stdin.readline()과 input()의 차이점

  • input() : 한 두줄, 가볍게 입력받을 때 사용
T = int(input())
A, B = map(int,input().split())

 

  • sys.stdin.readline() : 반복문으로 여러 줄을 입력받아야 할 때 사용. 이를 사용해야 시간초과가 발생하지 않음
import sys

T = int(sys.stdin.readline())
A, B = map(int,sys.stdin.readline().split())

- 한 줄 단위로 입력받기 때문에 개행문자를 제거(\n) + 기본 타입이 문자열(str)이기 때문에 정수로 사용하기 위해 int

- 공백만 제거하고 싶을때는 sys.stdin.readline().strip() 처럼 사용(문자열 앞과 끝의 공백 제거)

 

 

+) 임의의 개수의 정수를 한 줄에 입력받아 리스트에 저장

import sys

data = list(map(int,sys.stdin.readline().split()))

- 이는 list(map(int,input().split())과 동일하다.

 

 

출처 https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

 

>> 코딩테스트 등에서는 input()보다 sys.stdin.readline()을 써서 시간을 줄여야 한다!


https://youtu.be/_iqz7tFhox0

캐글 타이타닉 1. Dataset check

- pandas 기본 개체는 index와 value로 구성된 series. 이것들이 여러 개 모여 하나의 dataframe이 됨.

import missingno as msno

#타이타닉의 train 데이터를 df_train이라 저장
msno.matrix(df=df_train.iloc[:, :], figsize=(8,8), color=(0.8, 0.5, 1))

위의 코드는 왼쪽의 매트릭스를 만듦. 이는 msno(missingno, null값)에 대한 것으로 빈칸(하얀 부분)들이 모두 널값에 해당됨. 오른쪽은 matrix를 bar라고 수정한 `msno.bar(df=df_train.iloc[:, :], figsize=(8,8), color=(0.8, 0.6, 1))` 일때의 그래프.

 

 

https://youtu.be/sDH2zr48gTE

캐글 타이타닉 2. EDA - Pclass

- EDA(Exploratory Data Analysis) : 탐색적 데이터분석.

f, ax = plt.subplots(1, 2, figsize=(18,8))
#도화지(fig)를 만들고 ax를 1x2로 나눔(subplots)

df_train['Survived'].value_counts().plot.pie(explode=[0, 0.1], autopct='%1.1f%%', ax=ax[0])
ax[0].set_title('pie plot - Survived')
ax[0].set_ylabel('')
#ax[0]에 Survived에 대한 파이그림을 그려줌. explode로 0과 1사이에 간격을 만듦

sns.countplot('Survived', data=df_train, ax=ax[1])
ax[1].set_title('Count plot - Survived')
#ax[1]에 Survived에 대한 카운트플랏을 그림

plt.show() #전체 그림(도화지)을 보여줌

 

pd.crosstab(df_train['Pclass'], df_train['Survived'], margins=True)

 

- crosstab으로 Pclass와 Survived의 관계를 볼 수 있음.

- margins는 맨 마지막 행과 열에 해당하는 'All'(합계)를 의미

- 클래스가 높을수록 생존확률이 높은 경향이 있어 보임(136/216, 87/184, 119/491).

이를 확인하기 위해 클래스 별 전체 탑승자의 수와 생존/사망자의 그래프를 그려보자.

 

 

 

y_position = 1.02 #후에 타이틀의 위치를 설정해 줄 예정
f, ax = plt.subplots(1, 2, figsize=(18, 8))

df_train['Pclass'].value_counts().plot.bar(color=['#CD7F32','#FFDF00','#D3D3D3'], ax=ax[0])
ax[0].set_title('Number of Passengers By Pclass', y=y_position)
ax[0].set_ylabel('Count')

sns.countplot('Pclass', hue='Survived', data=df_train, ax=ax[1])
ax[1].set_title('Pclass: Survived vs Dead', y=y_position)
#Pclass에 따라 그리되 Survived에 따라(0, 1) 색을 다르게 칠해 그림

plt.show()


책 요약도 해야하는데 시간이 너무 빨리가요 ㅠ~ㅠ 이런...