02-2. 実装の問題の解決

27521 ワード

📝に質問白峻2562号です。


-質問


https://www.acmicpc.net/problem/2562
9つの異なる自然数を与える場合は、プログラムを作成し、その中の最値を見つけ、最値がいくつかの数であることを求めます.
例えば、9つの異なる自然数
3, 29, 38, 12, 57, 74, 40, 85, 61
もしあげたら、彼らの中の最高価格は85で、この価格は8番目です.
入力
1行目から9行目まで、各行に自然数が与えられます.与えられた自然数は100未満です.
しゅつりょく
1行目が最も多く、2行目が最も多く出力されます.

-コード💻

alist = []
for _ in range(9):
    alist.append(int(input()))

print(max(alist))
print(alist.index(max(alist)) + 1)

✔¥コンセプト復習


リスト内の要素のインデックス値を知りたい場合はisticを使用します.Index(「1」)構文を使用すると簡単に見つけられます->リストの「1」という要素が何位にあるかを知りたい場合.

📝問題2。白駿1316号です。


-質問


https://www.acmicpc.net/problem/1316
コンビネーションワードとは、単語に存在するすべての文字に対して、各文字が連続して現れる場合にのみ使用されます.例えば、ccazzzbbは、c、a、z、bが連続して現れるため、kinもk、i、nが連続して現れるが、aabbbbcbはbが落ちたため、組合せ語ではない.
プログラムを作成し、N個の単語を入力し、グループ内の単語数を出力してください.
入力
1行目の単語の個数はNです.Nは100以下の自然数である.2行目から、単語はN行に入ります.単語はアルファベット小文字だけで、繰り返しず、最長100です.
しゅつりょく
最初の行はグループ語の個数を出力します.

-コード💻

n = int(input())
vlist = []
for i in range(n):
    vlist.append(input())

check = 0  # 그룹단어이면 1, 아니면 0
count = 0  # 그룹단어 개수
mlist = []  # 단어의 문자를 저장할 변수 (중복 피하기 위해)

for i in vlist:
    # 단어 길이가 1이나 2이면 그룹단어로 취급
    # (a/ab/aa 세 경우만 있기 때문)
    if len(i) <= 2:
        count += 1

    # 단어 길이가 3 이상인 경우
    else:
        # 0번째 원소 먼저 저장
        mlist.append(i[0])
        # (단어 길이 - 1) 만큼 반복(비교)
        for k in range(len(i) - 1):
            if i[k] == i[k + 1]:
                # 연속해서 계속 같은 원소가 나온다면 '일단'은 그룹단어임
                check = 1

            else:  # i[k] != i[k+1]인 경우
                if i[k + 1] in mlist:
                    # 이미 존재하는 원소라면 '완전' 그룹단어 아님
                    check = 0
                    break
                else:
                    # 처음 나오는 원소라면 '일단'은 그룹단어임
                    mlist.append(i[k])
                    check = 1

        if check == 1:
            count += 1

    # 초기화 (새로운 단어)
    check = 0
    mlist = []

print(count)

-その他のコード💻

n = int(input())
count = n

for _ in range(n):
    word = input()
    for i in range(len(word) - 1):
        if word.find(word[i]) > word.find(word[i+1]):
            count -= 1
            break

print(count)

-プロセス📖


最初から問題自体が理解できなかったので、何度も読みました.コンビネーションワードという言葉は難しいので、理解してから->一つの文字が何度も連続して現れるのはいいが、連続して現れるのではなく、別の文字が現れてから現れるのはだめだ.そういう意味です.(そうですか?)例えば、aabbccであってもよいが、aabbccaであってはならない.
だから理解した上で、コードを簡単に実現しただけです.注釈をつけて、正しい説明と理解が分からない.そして、あまりにも非効率的な方法で解決したようです.他の答えを探してみると、ずっと簡単な問題だと気づきました.私は長い時間をかけて、真ん中にずっと条件をつけなければなりません.このように押すと、すぐに押し出すことができるようです.このような簡潔で簡潔なコードを書くためには、もっと努力しなければなりません.

✔¥コンセプト復習


aという名前の要素がlistにあるかどうかを決定します.
1. if a in alist: or if a not in alist:
2. alist.find(a)->特定の要素を検索し、インデックス値を返します.-1がなければ返却します.(複数のインデックスがある場合は、最初のインデックス値を返します)

📝に質問文字列圧縮


-質問


https://programmers.co.kr/learn/courses/30/lessons/60057

-答えコード💻

def solution(s):
    least_length = len(s)
    temp = 0
    # 문자열의 길이를 반으로 자름
    # 길이의 반을 넘어서면 어차피 두 문자열로 나뉘기 때문.
    for i in range(1, len(s)//2 + 1):
        # zip 함수에 문자열, n 전달
        temp = zip(i, s)
        if temp < least_length:
            least_length = temp
        
    return least_length     
        

# 문자열을 n개 단위로 잘라 압축하고, 압축된 문자열의 길이를 반환해주는 함수
def zip(num, s):
    i = 0
    zip_list = []
    while True:
        if i+num > len(s):
            zip_list.append(s[i:])
            break
        else:
            zip_list.append(s[i:i+num])
        i = i+num
    
    my_zip = ""
    before = zip_list[0]
    count = 1
    for i in range(1, len(zip_list)):
        curr = zip_list[i]
        # 앞에 나온 것과 계속 같은 것이 나온다면 
        if curr == before:
            # 나온 횟수 저장
            count += 1
        # 앞에 나온 것과 다른 것이 나온다면
        # 저장된 횟수만큼 압축 문자열에 추가
        else:
            if count == 1:
                my_zip = my_zip + before
            else:
                my_zip = my_zip + str(count) + before
            count = 1
        before = curr
    my_zip = my_zip + before
        
    return len(my_zip)

-比較分析📖


https://grapetown.tistory.com/2
多くの正解コードでこの文章を参考にした.
私に合うコードを見つけるのは難しいようです.
ちょっと難しい感じがしますが、、、!

📝に質問ビーム取り付け


-質問


https://programmers.co.kr/learn/courses/30/lessons/60061

-答えコード💻

def isValid(answer):
    for x,y,a in answer:
        if a==0:
            if (x,y-1,0) in answer or (x-1,y,1) in answer or (x,y,1) in answer or y==0:
                continue
            else:
                return False
        if a==1:
            if (x,y-1,0) in answer or (x+1,y-1,0) in answer or ((x-1,y,1) in answer and (x+1,y,1) in answer):
                continue
            else:
                return False
    return True

def solution(n, build_frame):
    answer = set()
    for x,y,a,b in build_frame:
        if b==0:
            answer.remove((x,y,a))
            if not isValid(answer):
                answer.add((x,y,a))
        else:
            answer.add((x,y,a))
            if not isValid(answer):
                answer.remove((x,y,a))

    answer = [list(i) for i in answer]
    answer.sort(key=lambda x:(x[0],x[1],x[2]))
    return answer

-比較分析📖


初めて見た時は模擬問題のように一つ一つ詳しく条件を作って解答していましたが、複雑すぎて長すぎて途中で諦めてもうまくいかず、たくさんのコードを探して、こんな簡単なコードがあることに気づきました.ああ、何か問題があって長くてちょっと難しいと、集中できないようです.怖がらないで、まず問題を理解することから始めましょう.
https://yjyoon-dev.github.io/kakao/2020/12/21/kakao-pillarfloor/
注:ブログ!

✔¥コンセプト復習-set(集合)


set:Pythonに集合するコンセプト.順序がなく、コレクションに一意の値があります.
s2 = set("Hello")
s2
{'e', 'H', 'l', 'o'}
順序がないため、インデックスで値にアクセスできません.インデックスで値にアクセスする場合は、リストまたは凡例に変換して使用します.交差、結合、差分を使用する場合に便利です.
値の追加->add
複数の値の追加->update
特定の値の削除->削除
**

+ランダ構文コメント**


https://velog.io/@oaoong/Python-lambda-%ED%91%9C%ED%98%84%EC%8B%9D
質問元:Backjun,Programmersホームページ

#.くどくど言う🔨


アルゴリズムは難しすぎて、、、いくつかのものが長くなったので、もっと難しくなったようです.今日の最後の2つの問題などの問題は実際のテストから出てきました.めまいがして、もっと努力して、、、そしてジョルディ、無知で、あなたもアウトになりました..