빠빠빠빠빠빠 뿌뿌뿌 빠빠빠 뿌뿌뿌 빠빠빠빠빠빠 뿌뿌뿌 빠빠빠 뿌뿌뿌 빠빠빠빠빠빠 뿌뿌뿌 빠빠빠 뿌뿌뿌
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
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 |