<jupyter_start><jupyter_text>출처https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDN86AAXw5UW6&subjectId=AWOVHzyqqe8DFAWg 학습개요- SW 문제해결 역량강화를 목표로 자료구조의 지식 습득 및 실제 구현 능력을 배양하는 과정입니다.학습목표1. 스택 자료구조의 개념과 기본 연산을 설명할 수 있다.2. 스택을 응용한 괄호 검사 알고리즘과 함수 호출과 재귀 호출에 대하여 설명할 수 있다.3. 재귀 호출의 중복을 보완하는 메모이제이션에 대하여 설명할 수 있다.4. 동적 계획법 알고리즘의 개념에 대하여 설명할 수 있다.5. 스택을 이용한 깊이 우선 탐색 알고리즘에 대하여 설명할 수 있다.  4869. [파이썬 S/W 문제해결 기본] 4일차 - 종이붙이기※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.어린이 알고리즘 교실의 선생님은 경우의 수 놀이를 위해, 그림처럼 가로x세로 길이가 10x20, 20x20인 직사각형 종이를 잔뜩 준비했다.   (그림 없음)그리고 교실 바닥에 20xN 크기의 직사각형을 테이프로 표시하고, 이 안에 준비한 종이를 빈틈없이 붙이는 방법을 찾아보려고 한다. N이 30인 경우 다음 그림처럼 종이를 붙일 수 있다.(그림 없음)10의 배수인 N이 주어졌을 때, 종이를 붙이는 모든 경우를 찾으려면 테이프로 만든 표시한 영역을 몇 개나 만들어야 되는지 계산하는 프로그램을 만드시오. 직사각형 종이가 모자라는 경우는 없다.[입력]첫 줄에 테스트 케이스 개수 T가 주어진다.  1≤T≤50다음 줄부터 테스트 케이스 별로 N이 주어진다. 10≤N≤300, N은 10의 배수[출력]각 줄마다 "T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.```입력:3305070	 출력:1 52 213 85```<jupyter_code># Make input file
f = open("input.txt", "w")
f.write("3\n")
f.write("30\n")
f.write("50\n")
f.write("70\n")
f.close()
# for Jupyter Notebook
###
f = open("input.txt", "r")
input = f.readline
###

T = int(input())

for test_case in range(1, T + 1):

    n = int(input())
    
    def paperNum(n):
        global checkn 
        checkn = [-1 for _ in range(n+1)]
        cnt = 0
        
        def recursivePaperNum(i):
            if checkn[i] != -1:
                return checkn[i]
            else:
                cnt = 0
                case = [1 , 2, 2]
                for c in case:
                    if i - c == 0:
                        cnt += 1
                    elif i - c > 0:
                        cnt += recursivePaperNum(i-c)
                checkn[i] = cnt
                return cnt
            
            cnt = recursivePaperNum(n)
            return cnt
        
        return recursivePaperNum(n)
        
    cnt = paperNum( int(n/10) )
    print("#"+str(test_case), cnt)<jupyter_output>#1 5
#2 21
#3 85<jupyter_text>4866. [파이썬 S/W 문제해결 기본] 4일차 - 괄호검사※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.주어진 입력에서 괄호 {}, ()가 제대로 짝을 이뤘는지 검사하는 프로그램을 만드시오. 예를 들어 {( )}는 제대로 된 짝이지만, {( })는 제대로 된 짝이 아니다. 입력은 한 줄의 파이썬 코드일수도 있고, 괄호만 주어질 수도 있다. 정상적으로 짝을 이룬 경우 1, 그렇지 않으면 0을 출력한다. print(‘{‘) 같은 경우는 입력으로 주어지지 않으므로 고려하지 않아도 된다. [입력]첫 줄에 테스트 케이스 개수 T가 주어진다.  1≤T≤50 다음 줄부터 테스트 케이스 별로 온전한 형태이거나 괄호만 남긴 한 줄의 코드가 주어진다. [출력] 각 줄마다 "T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.```입력:3print('{} {}'.format(1, 2))N, M = map(int, input().split())print('{} {}'.format(tc, find())	 출력:1 12 13 0```<jupyter_code># Make input file
f = open("input.txt", "w")
f.write("3\n")
f.write("print('{} {}'.format(1, 2))\n")
f.write("N, M = map(int, input().split())\n")
f.write("print('#{} {}'.format(tc, find())\n")
f.close()
# for Jupyter Notebook
###
f = open("input.txt", "r")
input = f.readline
###

T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    # ///////////////////////////////////////////////////////////////////////////////////
    strin = input()
    st = []
    result = 1
    for s in strin:
        
        if s == '(':
            st.append(s)
        if s == '{':
            st.append(s)
        if s == ')':
            if not len(st) > 0:
                result = 0
                break
            if st.pop(-1) != '(':
                result = 0
                break
        if len(st) > 0 and s == '}':
            if not len(st) > 0:
                result = 0
                break
            if st.pop(-1) != '{':
                result = 0
                break
    if len(st) > 0:
        result = 0
            
    print("#"+str(test_case), result)<jupyter_output>#1 1
#2 1
#3 0<jupyter_text>4871. [파이썬 S/W 문제해결 기본] 4일차 - 그래프 경로※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.V개 이내의 노드를 E개의 간선으로 연결한 방향성 그래프에 대한 정보가 주어질 때, 특정한 두 개의 노드에 경로가 존재하는지 확인하는 프로그램을 만드시오.두 개의 노드에 대해 경로가 있으면 1, 없으면 0을 출력한다. 예를 들어 다음과 같은 그래프에서 1에서 6으로 가는 경로를 찾는 경우, 경로가 존재하므로 1을 출력한다.(그림 없음) 노드번호는 1번부터 존재하며, V개의 노드 중에는 간선으로 연결되지 않은 경우도 있을 수 있다.  [입력] 첫 줄에 테스트 케이스 개수 T가 주어진다.  1≤T≤50 다음 줄부터 테스트 케이스의 첫 줄에 V와 E가 주어진다. 5≤V≤50, 4≤E≤1000 테스트케이스의 둘째 줄부터 E개의 줄에 걸쳐, 출발 도착 노드로 간선 정보가 주어진다. E개의 줄 이후에는 경로의 존재를 확인할 출발 노드 S와 도착노드 G가 주어진다. [출력] 각 줄마다 "T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.```입력:36 51 41 32 32 54 61 67 41 62 32 63 52 59 92 64 75 71 52 93 94 85 37 81 9	 출력:1 12 13 1```<jupyter_code># Make input file
f = open("input.txt", "w")
f.write("3\n")
f.write("6 5\n")
f.write("1 4\n")
f.write("1 3\n")
f.write("2 3\n")
f.write("2 5\n")
f.write("4 6\n")
f.write("1 6\n")
f.write("7 4\n")
f.write("1 6\n")
f.write("2 3\n")
f.write("2 6\n")
f.write("3 5\n")
f.write("2 5\n")
f.write("9 9\n")
f.write("2 6\n")
f.write("4 7\n")
f.write("5 7\n")
f.write("1 5\n")
f.write("2 9\n")
f.write("3 9\n")
f.write("4 8\n")
f.write("5 3\n")
f.write("7 8\n")
f.write("1 9\n")
f.close()
# for Jupyter Notebook
###
f = open("input.txt", "r")
input = f.readline
###

class node:
    def __init__(self, v):
        self.v = v
        self.nextNode = []
    def addE(self, e):
        self.nextNode.append(e)
        
class nodeList:
    def __init__(self, v):
        self.nodeList = []
        self.nodeOrder = []
        self.occupy = [False for _ in range(v)]
    def addVE(self, v, e):
        if not self.occupy[v-1]:
            newNode = node(v)
            newNode.addE(e)
            self.nodeList.append(newNode)
            self.nodeOrder.append(v)
            self.occupy[v-1] = True
        else:
            idx =self.nodeOrder.index(v)
            self.nodeList[idx].addE(e)
    def findRoute(self, s, e):
        if not self.occupy[s-1]:
            return 0
        idx =self.nodeOrder.index(s)
        nextNode = self.nodeList[idx].nextNode
        if len(nextNode) == 0:
            return 0
        for nn in nextNode:
            if e == nn:
                return 1
            else:
                if self.findRoute(nn, e) == 1:
                    return 1
        return 0
        

T = int(input())

for test_case in range(1, T + 1):

    v, e = map(int, input().split())
    result = 0
    
    nl = nodeList(v)
    
    # make node
    for _ in range(e):
        vv, ee= map(int, input().split())
        nl.addVE(vv, ee)
        
    start, end = map(int, input().split())
    result = nl.findRoute(start, end)
    print("#"+str(test_case), result)<jupyter_output>#1 1
#2 1
#3 1<jupyter_text>4873. [파이썬 S/W 문제해결 기본] 4일차 - 반복문자 지우기※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.문자열 s에서 반복된 문자를 지우려고 한다. 지워진 부분은 다시 앞뒤를 연결하는데, 만약 연결에 의해 또 반복문자가 생기면 이부분을 다시 지운다.반복문자를 지운 후 남은 문자열의 길이를 출력 하시오. 남은 문자열이 없으면 0을 출력한다. 다음은 CAAABBA에서 반복문자를 지우는 경우의 예이다. CAAABBA 연속 문자 AA를 지우고 C와 A를 잇는다.CABBA 연속 문자 BB를 지우고 A와 A를 잇는다.CAA 연속 문자 AA를 지운다.C 1글자가 남았으므로 1을 리턴한다.  [입력] 첫 줄에 테스트 케이스 개수 T가 주어진다.  1≤T≤ 50 다음 줄부터 테스트 케이스의 별로 길이가 1000이내인 문자열이 주어진다. [출력] 과 1번부터인 테스트케이스 번호, 빈칸에 이어 답을 출력한다.```입력:3ABCCBNNNASBBSNVUKJWHGGHNFTCRRCTWLALX	 출력:1 12 43 11```<jupyter_code># Make input file
f = open("input.txt", "w")
f.write("3\n")
f.write("ABCCB\n")
f.write("NNNASBBSNV\n")
f.write("UKJWHGGHNFTCRRCTWLALX\n")
f.close()
# for Jupyter Notebook
###
f = open("input.txt", "r")
input = f.readline
###

T = int(input())

for test_case in range(1, T + 1):

    strin = input().strip("\n")
    
    loop = True
    while loop:
        loop = False
        for i, s in enumerate(strin):
            if i == 0:
                prevs = s
                continue
            if prevs == s:
                loop = True
                strin = strin[:i-1] + strin[i+1:]
                break
            prevs = s

    result = len(strin)
    
    print("#"+str(test_case), result)<jupyter_output>#1 1
#2 4
#3 11
{'fraction_non_alphanumeric': 0.15272870043188064, 'fraction_numerical': 0.040308860096845964, 'mean_word_length': 1.9201375620940007, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 18, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '315226', 'license': 'Apache-2.0', 'n_tokens_mistral': 4491, 'n_tokens_neox': 5079, 'n_words': 985, 'path': 'notebook/SWExpertAcademy/Course/ProgramingIntermediate/03_Stack1.ipynb', 'repo_name': 'Kyungpyo-Kim/DataStructure_Algorithm', 'size': '7641'}