본문 바로가기

STUDY

파이썬 스터디 10주차

https://youtu.be/RFEnk26fGMQ

빠빠빠빠빠빠 뿌뿌뿌 빠빠빠 뿌뿌뿌 빠빠빠빠빠빠 뿌뿌뿌 빠빠빠 뿌뿌뿌 빠빠빠빠빠빠 뿌뿌뿌 빠빠빠 뿌뿌뿌


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

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net

import sys

k = int(sys.stdin.readline())
moneys = []
for i in range(k):
  nums = int(sys.stdin.readline())
  if nums == 0:
    moneys.pop()
  else:
    moneys.append(nums)
print(sum(moneys))

> 정수가 0일 경우 가장 최근에 쓴 수를 지우고(pop) 아닐 경우 해당 수를 쓴다. 포인트는 정수가 "0"일 경우 지울 수 있는 수가 있음이 보장된다는 것. 최종적으로 적어낸 수의 합은 sum으로 구한다.

> pop은 마지막 원소를 빼(삭제해)주며, append는 마지막 자리에 원소를 써준다.

> stack의 개념을 모르더라도 풀 수 있는 문제. 포인트는 뒤에서부터 넣고 뒤에서 빼는것!

 

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

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

import sys

n = int(sys.stdin.readline())
stack = []

for i in range(n):
  word = sys.stdin.readline().split()
  order = word[0]
  if order == "push":
    stack.append(word[1])
  elif order == "pop":
    if len(stack) == 0:
      print(-1)
    else:
      print(stack.pop())
  elif order == "size":
    print(len(stack))
  elif order == "empty":
    if len(stack) == 0:
      print(1)
    else:
      print(0)
  elif order == "top":
    if len(stack) == 0:
      print(-1)
    else:
      print(stack[-1])

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램 작성. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

> 주어진 명령이 많아서(push, pop, size, empty, top) 코드가 길 뿐 스택 기본 개념만 알면 충분히 풀 수 있는 문제. 물론 헷갈려서 구글링을 좀 하긴 했지만 이해에 큰 무리는 없었다!

 

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

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

import sys

t = int(sys.stdin.readline())
for i in range(t):
  strng = sys.stdin.readline().strip()
  s = list(strng)
  temp = 0
  for i in s:
    if i == '(':
      temp += 1
    elif i == ')':
      temp -= 1
    if temp < 0:
      print("NO")
      break
  if temp > 0:
    print("NO")
  elif temp == 0:
    print("YES")

입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다. 

> 처음에 count('(')와 count(')')를 사용해 풀었다. 이 경우 ())(()같은 걸 yes라 판단하게 되므로.. 다른 방식으로 생각(+1과 -1이라 생각)하는 게 필요했다. 아이디어를 떠올리지 못해 결국 구글링했다ㅠㅠ

> vps특징상 (다음엔 )가 반드시 와야 할 것이다. 이를 활용해 (를 +1, )를 -1로 두고 그 합을 계산해준다!

> 나도 이런거 한번에 떠올릴 수 있는 사람이 되고싶다.. 쩝

다음에 다시 풀어보자!!

 

스택 개념은 다음의 블로그를 참조하였습니다.

https://gorokke.tistory.com/129

 

[자료구조] 파이썬 스택(stack) 총정리

1. 스택이란? : 가장 나중에 넣은 데이터를 가장 먼저 빼낼 수 있는 데이터 구조로 Last In First Out(LIFO) 방식이다. (혹은 FILO : First In Last Out) 파이썬에서는 list [] 로 이미 구현되어있다. 2. 사용법(..

gorokke.tistory.com

https://mong9data.tistory.com/35

 

[자료구조][파이썬/Python] 스택(Stack)

스택(Stack) 스택(Stack)은 데이터 값을 저장하는 기본적인 구조로, 일차원의 선형 자료구조이다. 기본적으로 값을 저장하는 연산 push와 저장된 값을 꺼내는 연산 pop이 제공되어야 한다. 부가적으로

mong9data.tistory.com

**스택**
LIFO(Last In First Out) 혹은 FILO(First In Last Out)방식의 데이터구조. 파이썬에서는 list로 구현되어 있음.
> 내장함수로 이용 : 리스트명.append(), 리스트명.pop()
> 클래스로 구현
스택.__init__
스택.push() (데이터 삽입)
스택.pop() (마지막에 삽입한 데이터 꺼내고 삭제)
스택.top() (마지막에 삽입한 데이터 꺼내 리턴)
스택.peek() (마지막에 삽입한 데이터 출력)
스택.isEmpty() (비어있는가?에 대한 bool)
스택.items() (어떤 요소들이 있는지 출력)
스택size() (몇 개의 요소가 있는지 출력)
 
 

 

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

 

1259번: 팰린드롬수

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

www.acmicpc.net

import sys

while True:
  a = sys.stdin.readline().strip()
  b = a[::-1]
  if a == '0':
    break
  elif a == b:
    print("yes")
  elif a != b:
    print("no")

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 수도 팰린드롬으로 취급할 수 있다. 주어진 수가 팰린드롬수면 'yes', 아니면 'no' 출력.

> 출력초과가 뜨길래 으잉? 했다. 코드를 뜯어보니 if a=='0'을 if a==0이라고 둬서 0을 쳐도 break가 되지 않았다는 걸 깨달았다.. ㅋㅋㅋㅋ아이 부끄러ㅋㅋ

> 팰린드롬은 풀때마다 헷갈리는 것 같다. 문제를 접하면 거의 자동반사적으로 for문을 써서 i번째 인덱스와 -i-1번째 인덱스 값을 비교하려함.. 그럴 필요 없이 그냥 뒤집어서 같은지 다른지만 보면 되는데 말이다.

 

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

 

1085번: 직사각형에서 탈출

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램

www.acmicpc.net

import sys

x, y, w, h = map(int, sys.stdin.readline().split())
print(min(x-0, y-0, w-x, h-y))

직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램 작성

> 진짜 어이없는 문제.. 예제 하나가 1, 1, 5, 5인데 출력값이 1이라길래 ????하다 알아냄..아 원점(0,0)도 경계선으로 쳐주는 거구나..ㅋ..ㅋㅋ... 그래서 x-0, y-0도 같이 min에다 다 써주면 끝이다..ㅎ

 

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

 

15829번: Hashing

APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정

www.acmicpc.net

import sys

l = int(sys.stdin.readline())
strng = sys.stdin.readline().strip()
ans = 0
for i in range(l): 
  ans += (ord(strng[i])-96) * (31**i)
print(ans % 1234567891)

해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수. 대표적으로 자료의 저장과 탐색에 쓰임. 

 > 식은 알겠는데 어떻게 문자열을 숫자로 변경할 지에 대해 정보가 없어 그냥 구글링했다. 아스키코드로 변환하는 함수를 사용하더라. 역시..ㅋ 이런건 구글링 하는게 맞다..

> 그냥 해시함수라는 게 있구나 하고 배워간다!

 

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

 

4153번: 직각삼각형

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

www.acmicpc.net

import sys

while True:
  lst = list(map(int, sys.stdin.readline().split()))
  lst.sort()
  if sum(lst) ==0:
    break
  if (lst[0]**2) + (lst[1]**2) == (lst[2]**2):
    print("right")
  else:
    print("wrong")

주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분

> 피타고라스? 껌이지~ 하면서 a, b, c로 놓고 풀었는데 '틀렸습니다'가 떴다. ...어?

> 친구한테 물어보니 a, b, c사이에 c가 가장 큰 값이라는 가정이 없는 것 같다고 해서.. sort를 쓰기위해 리스트로 바꿔보니 바로 맞았다!! 이거였구나ㅠㅠ 문제 꼼꼼히 읽는 습관을 들여야겠다!

 

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

 

1436번: 영화감독 숌

666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타

www.acmicpc.net

import sys

n = int(sys.stdin.readline())
cnt = 0
six_n = 666
while True:
  if '666' in str(six_n):
    cnt += 1
  if cnt == n:
    print(six_n)
    break
  six_n += 1

제일 작은 종말의 숫자는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 과 같다. 숌이 만든 N번째 영화의 제목에 들어간 숫자를 출력하는 프로그램 작성

> 혼자 풀어보고 싶었는데.. 입력값 n이 10000까지라길래 list(range(10000))으로 놓고 구하다가 멘탈이 나가버렸다. 답지보고 푸는거 누가 못하냐구… 그래도 뭐라도 남는 게 있다면, 하다못해 해답 코드를 외운다면 그것대로 의미가 있긴 하겠지만… 스트레스 받는다ㅠㅠ

> 풀 수 있었을 것 같은데 못풀어서 구글링했다. 이런 문제에 낑낑대는 내가 싫다. 그래도 어떻게 푸는지 알아야 다음에는 안 낑낑대겠지ㅠ

> 666에서 시작해 While문 안에서 1씩 더해가며 str(숫자)에 666이 있다면 카운팅을 하고 666의 개수가 입력받은 n과 같아질 때 더해가던 숫자값을 프린트한다.

> 다음에 꼭 다시 한번 풀어보자.

 


 

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

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

import sys

words = 'abcdefghijklmnopqrstuvwxyz'
s = sys.stdin.readline().strip()
for x in words:
  if x in s:
    print(s.index(x))
  else:
    print(-1)

https://metamon-ditto.tistory.com/24 다시풀었씁니다(1)

> 맹세코 코드 안보고 문제만 보고 풀었습니다!!

> 위의 문제들 절반은 구글링해서 풀었던 것 같아 우울했는데 이렇게 풀었던 문제를 다시 푸니 새삼 성장한 것 같아 기분이 죠습니다

> 포인트는 words(길이)만큼 '입력받은 문자가 있는지 확인'을 반복(있다면 인덱스값 출력)하는 것입니다!

 

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

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net

import sys

t = int(sys.stdin.readline())
for i in range(t):
  r, s = sys.stdin.readline().split()
  r = int(r); s = s.strip()
  for x in s:
    print(r*x, end='')
  print()

https://metamon-ditto.tistory.com/24 다시풀었씁니다(2)

> 분명.. 풀었던건데.. 저 r과 s처리가 힘들었습니다. 별별 방법을 다 쓰다 결국 슬쩍.. 아주 슬쩍 봤어요.

> 나머지는 정말 손 가는대로, 생각나는대로 푼거라 조금 코드가 더럽긴 합니다.

> 제 추측인데, 마지막 줄의 print()는 다음 출력과의 구분을 두기 위함인 것 같아요. 저거 안 쓰면 틀렸다고 나옴. 또 실제로 마지막줄 안 쓴 상태로 코랩에서 돌렸을때 3 ABC와 5 /HTP 사이의 공백이 거의 없었습니당

 

'STUDY' 카테고리의 다른 글

파이썬 스터디 ver2. 2주차  (4) 2022.04.05
파이썬 스터디 ver2. 1주차  (3) 2022.03.31
파이썬 스터디 9주차  (0) 2022.03.04
파이썬 스터디 4주차(머신러닝)(3)  (0) 2022.03.03
파이썬 스터디 4주차(머신러닝)(2)  (1) 2022.02.22