Algorithm/programmer/level 1/210613/10題(Python使用)


2021年6月13日


これはプログラマーが解いたレベル1 10題の集合です.
コードには問題解決の説明が注記されています.

📖 質問1:ダーツゲーム



パスワード

def solution(dartResult):
    answer = 0
    
    # 'S', 'D', 'T'에 대한 제곱수를 미리 사전 자료형에 담아두었다.
    sdt = {
        'S' : 1,
        'D' : 2,
        'T' : 3
    }
    
    
    tmp = list()
    # iterator
    i = 0
    while i < len(dartResult):
        # 현재 문자가 정수형이라면
        if dartResult[i].isdecimal():
            # 그런데 한 문자는 한 개의 숫자로 이루어져있어서 10을 처리할 수 없기 때문에 따로 처리
            if dartResult[i] == '1' and dartResult[i+1] == '0':
                tmp.append(10)
                i += 1
            else:
                # 한자릿수의 숫자는 바로 리스트tmp에 넣는다.
                tmp.append(int(dartResult[i]))
        # 현재 문자가 알파벳이라면(S,D,T)
        elif dartResult[i].isalpha():
            tmp[-1] **= sdt[dartResult[i]]
        else:
            # 현재 문자가 '*'이라면
            if dartResult[i] == '*':
                if len(tmp) > 1:
                    tmp[-1] *= 2
                    tmp[-2] *= 2
                # 첫 번째 기회에서 스타상이라면
                else:
                    tmp[-1] *= 2
            # 현재 문자가 '#'이라면
            elif dartResult[i] == '#':
                tmp[-1] *= (-1)
        i += 1
    # 현재까지 구한 점수 더하기
    for i in tmp:
        answer += i
    return answer

΄コード->他の人のコード

  • の10点を処理するために、文字列「10」の代わりに「k」を使って問題を解いたのが印象的でした...
  • def solution(dartResult):
        point = []
        answer = []
        
        # 10점을 처리하기 위해서 미리 문자열'10'을 'k'로 대체
        dartResult = dartResult.replace('10','k')
        point = ['10' if i == 'k' else i for i in dartResult]
        print(point)
    
        i = -1
        sdt = ['S', 'D', 'T']
        for j in point:
            if j in sdt :
                answer[i] = answer[i] ** (sdt.index(j)+1)
            elif j == '*':
                answer[i] = answer[i] * 2
                if i != 0 :
                    answer[i - 1] = answer[i - 1] * 2
            elif j == '#':
                answer[i] = answer[i] * (-1)
            else:
                answer.append(int(j))
                i += 1
        return sum(answer)

    💡 認識文法

  • C++では、for文でfor文を変更できる反復器とは異なり、Pythonでは不可能です.
    変更後、値はすぐに変更されますが、文が返されると、反復器は元の値を返します.
  • # 0 1 2 4가 아닌, 
    # 결과 : 0 1 2 3 4
    for i in range(5):
        print(i, end = ' ')
        if i == 2:
            i += 1

    📖 問題2:別々の数字配列



    パスワード

    def solution(arr, divisor):
        answer = []
        arr.sort()
        for a in arr:
            if a % divisor == 0:
                answer.append(a)
    
        if not answer:
            answer.append(-1)
    
        return answer

    ΄コード2->より簡潔なコード

    def solution(arr, divisor):
        answer = []
        arr.sort()
        # 리스트 컴프리헨션 사용
        answer = [x for x in arr if x % divisor == 0]
        return answer if answer else [-1] 

    📖 質問3:2つの整数の間の和



    パスワード

    def solution(a, b):
        answer=0
        a,b=min(a,b),max(a,b)
        for i in range(a,b+1):
            answer+=i
        return answer

    ΄コード->他の人のコード

  • sum()
  • を使用
    def solution(a, b):
        answer = 0
        if a>b : a,b = b,a
        return sum(range(a,b+1))
    

    range(n)

  • 範囲資料型
  • 戻り値:<クラス"range"(可変シーケンスタイプ)
  • list()関数を使用して範囲をリストに変更し、範囲に含まれる値を決定します.
  • 📖 質問4:文字列内で任意にソート



    パスワード

    def solution(strings, n):
       # 람다 함수를 사용해서, 첫번째 기준: 인덱스 n에 있는 문자, 두번째 기준: 사전에서 앞에 나온 것 순으로
       return sorted(strings, key=lambda x: (x[n], x))
  • やっと私も初めて1行のコードで説明しました!
  • 📖 質問5:文字列のpとyの個数



    パスワード

    def solution(s):
        answer = True
        if s. count('p')+s.count('P' ) != s. count('y')+s.count('Y') :
            answer =False
    
        return answer
    ->lower()を使用してすべてのアルファベットを作成した後
    s.count('p') != s.count("y")を作る方法もあります!

    📖 質問6:文字列降順で並べ替え



    パスワード

  • 題を読み間違えたので...昇順に並べて、大文字は後で来ると思って、解けました・・・問題をよく読む^0^
  • def solution(s):
        answer = ''
        # 대문자를 담는 리스트
        upper = []
        # 소문자를 담는 리스트
        lower = []
        
        # 문자열에는 sort()가 없어서 일부로 list로 만들었지만,
        # sorted()를 사용해서 정렬할 수 있으니 굳이 list로 만들 필요가 없었다.
        s = list(s)
        for i in s:
            if i.isupper():
                upper.append(i)
            else:
                lower.append(i)
                
        upper.sort(reverse=True)
        lower.sort(reverse=True)
        answer = ''.join(lower)+''.join(upper)
        return answer

    💡 文字列のソート


    文字列をソートする場合は、ソート()関数を使用します.
    逆にsorded()関数はlistを返しますので、文字列に戻すにはjoin()関数と一緒に使用する必要があります.
    文字列を並べるときは、大文字が先、小文字が後に着きます!

    📖 質問7:文字列の基本



    パスワード

    def solution(s):
    
        return True if (len(s) == 4 or len(s) == 6) and s.isdigit() else False

    ΄コード->他の人のコード


    チェック
  • sの長さが4または6のコードを「in演算子」で処理した.
  • def solution(s):
        return if s.isdigit() and len(s) in (4,6)

    📖 質問8:ソウルで金相公を探す



    パスワード

    def solution(seoul):
        return "김서방은 {}에 있다".format(seoul.index("Kim"))

    エレメントの場所の検索


    1.文字列->find()、rfind()

  • find():左から探して、初めて現れる位置を探します.
  • rfind():右から探して、初めて現れる位置を探します.
  • 検索する要素が文字列内にない場合は、-1を返します.
    print("장발장은 거꾸로 해도 장발장".find("장발장")) # 0
    print("장발장은 거꾸로 해도 장발장".rfind("장발장")) # 12

    2.リスト->インデックス()

  • index():左側から最初に現れる位置を探します.
  • の要素がリストに見つからない場合、ValueErrorが生成されます.
  • a = list("장발장은 거꾸로 해도 장발장")
    print(a.index("장")) # 0

    📖 質問9:小数点を検索



    パスワード

    def solution(n):
        answer = 0
        # 에라토스테네스의 체를 위한 표
        # index에 해당하는 수가 소수이면 True, 아니면 False
        isPrime = [True] * (n+1)
    
        for i in range(2, n//2+1):
            # 소수의 배수들은 모두 소수가 아니다.
            if isPrime[i]:
                j = 2
                while i * j <= (n):
                    isPrime[i*j] = False
                    j += 1
      
        # 소수의 개수 세기
        for i in range(2, n+1):
            if isPrime[i]:
                answer += 1 
        return answer

    ΄コード->他の人のコード

  • では,スパイラル藻のふるいで問題を解くのは私と同じであるが,異なるのは,2からn個の数を含む集合を生成した後,少数倍数を削除する方式である.
  • def solution(n):
        # 2 ~ n의 수를 담은 집합 생성 -> 나중에는 소수의 집합이 된다.
        num = set(range(2, n+1))
        
        for i in range(2, n+1):
            # i가 소수라면
            if i in num:
                # n이하의 i의 배수를 num에서 삭제한다.    
                num -= set(range(i*2, n+1, i))
                
        return len(num)

    rangeを使用してn未満のiの倍数リストを作成する

    i, n = 5, 100
    a = list(range(i, n+1, i))
    print(a) # [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]

    📖 第十題:スイカスイカスイカスイカスイカスイカスイカスイカ水?



    パスワード

    def solution(n):
        return "수박"*(n//2) if n % 2 == 0 else "수박"*(n//2) + "수"

    ΄コード->他の人のコード(もっと簡潔!!!!)

    def solution(n):
        return "수박"*(n//2) + "수"*(n%2)
    1行のコードに欲があるので、1行のコードもたくさん書きました.
    1行のコードよりも親切なコードで書くべきです...