파이썬 31

[SWEA] 1248. 공통 조상

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15PTkqAPYCFAYD SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 트리 자료를 저장하는 방법에 따라 쉽게 풀릴 수도, 아닐 수도 있는 문제였다. 나는 처음에 딕셔너리로 부모 : [자식1, 자식2] 을 받아줬는데 공통 조상을 찾을 때 코드 구현이 난감했다. 떠오른 것은 리스트에 [부모, 자식1, 자식2] 으로 받아주는 것과 클래스를 만들어주는 건데 리스트가 더 편할 것 같아서 이렇게 구현했다. 부모 찾기, 가장 가까운 공통 부모 찾기, sub_tree 개수 찾기 모..

알고리즘 2021.09.30

[SWEA] 1240. 단순 2진 암호코드

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 암호들을 보면 맨 뒤가 모두 1로 시작하는 것을 알 수 있다. 따라서 탐색을 할 때도 행의 맨 뒤부터 보며 1이 나타나는지를 확인한다. 1이 나오면 거기부터 56개가 암호이므로 my_code 변수에 저장하고 break 해준다. my_code 에서 7개씩 잘라 my_dict 안에 있는 암호와 비교해서 변환 시켜주고 odd는 odd끼리, even은 even끼리 더해준다. 최종 계산 결과가 10의 배수일..

알고리즘 2021.09.29

[백준] 1744. 수 묶기

https://www.acmicpc.net/problem/1744 1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 www.acmicpc.net 입력을 받을 때 부터 조건문을 이용해 1일 경우는 그냥 answer에 더 해주고, 1보다 클 경우는 gt_arr에, 0과 음수는 lt_arr에 담아준다. 이때 1을 리스트에 넣지 않고 더해주는 이유는 1*n 과 1+n 중에 1+n이 더 크기 때문이다. 1의 경우는 곱셈을 하면 절대 최댓값이 나오지 않는다. 양수일 경우 내림차순으로 정렬, 음수일 경우는 오름차순으로 정렬해준다. 이는 큰 원소들끼리..

알고리즘 2021.09.29

[백준] 12904. A와 B

https://www.acmicpc.net/problem/12904 12904번: A와 B 수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수 www.acmicpc.net 처음에는 s에서 t로 바꿔주기 위해 모든 경우의 수를 다 살펴보는 방법을 생각했는데, 이는 T의 최대 길이가 1000이므로 시간초과가 날 수 밖에 없는 코드였다. 여기서 생각의 전환이 필요한데, S를 T로 바꾸는 것이 아니라 T를 S로 바꿔준다면 while 문으로 쉽게 끝낼 수 있다. 알고리즘 문제를 풀 때 아이디어가 얼마나 중요한 지 알 수 있는 문제였다. ..

알고리즘 2021.09.28

[백준] 1541. 잃어버린 괄호

https://www.acmicpc.net/problem/1541 1541번: 잃어버린 괄호 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 www.acmicpc.net 일단 덧셈을 먼저 다 해준 다음에 빼주면 되니까 '-'를 기준으로 split() 해준다. 리스트의 첫 원소에 숫자만 있을 수도, + 연산자가 같이 있을 수도 있으므로 일단 '+'를 기준으로 split() 한 뒤 더해준 결과를 answer에 저장한다. 그 뒤에 똑같이 '+'를 기준으로 split() 한 뒤 더해준 결과를 answer에서 계속 빼주면 된다. 처음에는 eval() 함수를 이용해서 ..

알고리즘 2021.09.28

[백준] 1931. 회의실 배정

1931번: 회의실 배정 (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다. www.acmicpc.net 활동 선택 문제의 일종이다. 종료 시간을 기준으로 정렬해서, 종료 시간이 빠른 것을 선택하는 Greedy 적인 사고로 해결할 수 있다. 종료 시간이 같은 경우는 시작 시간이 빠른 순으로 정렬해주어야 (2,2) (1,2) 순서로 들어온 데이터에도 적용이 가능하다. 처음에는 sort를 두 번 해줬는데 key=lambda x: () 로 튜플 안에 여러 인자를 주면 인자 순서대로 정렬된다. 그 뒤 for문을 돌며 greedy로 해결해주면 된다. import sys input = sys.stdin.readline # 활동 선택 문제 -> 종료시간을 기준으로 정렬 n = int(input..

알고리즘 2021.09.24

[백준] 9935. 문자열 폭발

https://www.acmicpc.net/problem/9935 9935번: 문자열 폭발 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모 www.acmicpc.net 그냥 완전 탐색으로 풀었더니 당연히 시간초과가 났다. 스택을 생각했다가 어떻게 활용해야 될지 모르겠어서 패스 했는데 알고리즘 분류에도 스택이 있길래 다시 도전했다. 스택으로 한참 생각해보니까... 의외로 쉬워서 당황 ㅋㅋ 스택 수열 풀때랑 비슷..? 하게 일단 스택에 넣고 확인하는 게 답이었다. 일단 스택에 집어 넣은 뒤, 스택의 top과 bomb의 마지막 글자가 같고 스택의 길이가..

알고리즘 2021.09.18

[SWEA] 1218. 괄호 짝짓기

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 처음에는 if-else의 지옥같은 코드를 짰는데... 다른 스터디원의 아이디어로 획기적으로 깔끔한 코드를 짤 수 있었다. 자료구조를 적재적소에 활용하는 감각을 제대로 익히고 싶다. 아무튼 괄호 짝은 if-else 말고 딕셔너리로 깔끔하게 짤 수 있다는 사실을 알게 되었다. from collections import deque exp = {'[':']', '{':'}', '(':')', ''} for tc in range(1, 11): answer = 1 _ = int(input()) q = deque() gwal = input() for g in gwal: if ..

알고리즘 2021.09.16

[백준] 19583. 싸이버개강총회

https://www.acmicpc.net/problem/19583 19583번: 싸이버개강총회 첫번째 줄에는 개강총회를 시작한 시간 S, 개강총회를 끝낸 시간 E, 개강총회 스트리밍을 끝낸 시간 Q가 주어진다. (00:00 ≤ S < E < Q ≤ 23:59) 각 시간은 HH:MM의 형식으로 주어진다. 두번째 줄부터는 www.acmicpc.net 처음에는 H, M을 모두 나눠서 따로 if 문을 작성해 줬었는데 무슨 조건이 빠진 건지 계속 틀렸다고 나왔다. 근데 생각해보니 24시간으로 표시하니까 HH:MM 자체를 4자리 숫자로 만들어도 되는 거였다. 수많은 if문이 중첩되어 있던 이전의 코드보다 훨씬 깔끔하고 알아보기 쉬웠다. 작은 아이디어 하나로 깔끔한 코드를 짤 수 있다는 점에 매일 놀란다. impo..

알고리즘 2021.09.15