BAEKJOON : 17413, 10799, 17298


No. 17413


1. Problem



2. My Solution
タグflagを使用して、
  • マークの付いた部分と普通の単語の部分
  • を区別する.
    import sys
    
    s = sys.stdin.readline().strip()
    word =''
    tag = False
    
    for i in s: 
        if i == '<':
            tag = True                  # 해당 부분부터 태그로 인식
            print(word[::-1],end="")    # 전에 단어가 존재했으면 역순으로 출력
            word =''                    # word 초기화
            word += i
            
        elif i == '>':                  
            tag = False                 # 해당 부분부터 태그 해제
            word += i
            print(word,end="")          # 태그 출력
            word = ''                   # word 초기화
           
        elif i == ' ' and tag == False:     # 태그가 아닌 구간에서 ' ' 공백이면 단어의 끝을 의미
            print(word[::-1]+" ",end ="")   # 단어 역순으로 출력
            word =''                        # word 초기화
        else: 
            word += i
    
    print(word[::-1])                   # 태그가 아닌 word 가 남았다면  역순으로 출력
    3. Learned
  • while文で「>」文字に遭遇するまで
  • を実行できるようです.
  • flag機能をよく使いましょう
  • No. 10799


    1. Problem

    2. Others' Solutions
  • (「スタック
  • にプッシュ」)
    "
  • "),"前面は"("ラーメン"()"なので、レーザー(スタック内の要素数(=本数)と同じ+)
  • "
  • 」)「手前は」「ラーメン棒の末端(+1)

  • raser flag
  • を使用するか、前がraserであるか否かを判断する
    import sys
    
    p = sys.stdin.readline().strip()
    stack = []
    raser = False
    count = 0
    
    for i in p:
        if i == '(':
            stack.append(i)
            raser = False
        elif raser == False:
            stack.pop()
            count += len(stack)
            raser = True
        else:
            stack.pop()
            count += 1
        
    print(count)
    
    3. Learned
  • の問題を理解する->問題を解決するために必要な重要な原理を決定し定義する->実装アルゴリズム
  • 注:YouTube
  • No. 17298


    1. Problem

    2. My Solution
  • の数列を逆順popとし、残りの要素と比較->タイムアウト
  • 入力nは1000000に達し、最悪の場合比較演算は1+2+3+...+99999999+100000回、時間複雑度O(n^2)
  • import sys
    
    n = int(sys.stdin.readline().strip())
    sequence = list(reversed(list(map(int,sys.stdin.readline().strip().split()))))
    result = []
    
    while(len(sequence) > 1):
    
        found = False
        i = sequence.pop()
    
        for j in range(len(sequence)-1,-1,-1):
            if i < sequence[j]:
                found = True
                result.append(sequence[j])
                break
    
        if found == False:
            result.append(-1)
    
    print(' '.join(map(str,result)), -1)
    3. Others' Solutions
  • 第1の方法
  • pop操作を実行し、
  • notFoundスタックの上部から上部が大きくなるまで
  • 最後に-1をnotFoundスタックの残りのインデックス
  • に挿入する.
    import sys
    
    test_n = int(sys.stdin.readline().strip())
    sequence = list(map(int,sys.stdin.readline().strip().split()))
    
    notFound = []
    notFoundIndex = []
    result = [0 for i in range(test_n)]
    
    for i in range(len(sequence)):
    
        if len(notFound) > 0:
            for j in range(len(notFound)-1,-1,-1):
                if notFound[j] < sequence[i]:
                    result[notFoundIndex[j]] = sequence[i]
                    notFound.pop()
                    notFoundIndex.pop()
                else:
                    break
        
        notFound.append(sequence[i])
        notFoundIndex.append(i)
    
    for i in notFoundIndex:
        result[i] = -1
    
    print(' '.join(map(str,result)))
  • 第2の方法
  • 最初から結果を-1
  • に初期化する.
    i番目の要素のインデックス値(i)を
  • notFoundスタックの
  • にプッシュ
  • シーケンススタック
  • の比較
    import sys
    
    n = int(sys.stdin.readline())
    sequence = list(map(int,sys.stdin.readline().strip().split()))
    
    notFound = []
    result = [-1] * n
    
    for i in range(n):
        while len(notFound) > 0 and sequence[notFound[-1]] < sequence[i]:
            result[notFound.pop()] = sequence[i]
            
        notFound.append(i)
    
    print(' '.join(map(str,result)))
    4. Learned
  • AおよびB論理演算子の場合、A部分がfalseである場合、B部分は実行せず、
  • を直接スキップする.
  • B部分に異常が発生した場合は、-catch文で
  • を実行するように順番に戻ってください.
  • トラブルシューティングコア原理注:YouTube2