TOYPRO 해설문 - 비밀번호(500점)

1. 개요


경기 프로그래밍 사이트 "TOYPRO"300점 문제, 비밀번호 해설!
질문 페이지는 다음과 같습니다. https://app.toy-pro.net/user/questions/140
급히 쓰는 사람은 최대 3절이다.

2. 질문


태랑군은 비밀번호를 입력할 때 다른 사람이 해독하지 않도록 암호화하는 프로그램을 생각해냈다.
입력한 알파벳, a는 0, b는 1...,z는 25의 숫자로 대체한다.
교체된 숫자의 3배 숫자를 26여수로 나누면 새로운 숫자가 된다.
그리고 숫자를 알파벳으로 바꾸는 것을 암호화된 알파벳으로 만들었다.
예를 들어 ab를 입력하는 상황을 고려한다.
ab를 각각 숫자로 바꾸는 것은 01이다.
01은 각각 3배, 26을 나눈 나머지는 03이다.
그리고 이 숫자를 영문 자모로 바꾸면 AD다. 이것이 암호화된 문자열이다.
그러면 알파벳 (소문자만) 을 입력한 다음 암호화된 알파벳 print를 만드는 프로그램을 작성하십시오.

필요 변수


password

입력 예 1


password = "abcd"

출력 예 1


adgj

입력 예 2


password = "AAAA"

출력 예2


エラー

3. 해설


있긴 있지만 잘 보이지 않는 예


대체로 두 가지 방법이 있다.
첫 번째 방법은 사전(dict형)이나tuple(or list)형에 문자와 숫자의 대응표를 만들기 위해 노력하는 것이다.
이번에disct형을 사용해 보고 싶습니다.
password = "abcd" # 必要な変数を定義
pass2num = {"a": 0, "b": 1, "c": 2, "d": 3, "e": 4, "f": 5, "g": 6, "h": 7, "i": 8, "j": 9, "k": 10, "l": 11, "m": 12, "n": 13, "o": 14, "p": 15, "q": 16, "r": 17, "s": 18, "t": 19, "u": 20, "v": 21, "w": 22, "x": 23, "y": 24, "z": 25} # 対応表作成
enc = "" # 数字化された文字列を入れる変数を定義
txt = "" # 暗号化された文字列を入れる変数を定義


if password.lower() == password: 
    # lowerで小文字にして元のpasswordと違うかを比べる。
    # これによって大文字が含まれているかがわかる(大文字があったらlowerで小文字にされるため)
    
    # 数字化をする
    for i in password: # これで1文字ずつpasswordの文字がiにaから順に文字が入っていく
        enc += str(pass2num[i]*3%26) #対応表から数字を取り出して3倍して26を割ったあまりをencに入れる
    
    # 暗号化をする
    for i in enc: # これで1文字ずつencの文字がiにaから順に文字が入っていく
        # 辞書の逆引きをする
        # 参考サイト: https://note.nkmk.me/python-dict-get-key-from-value/
        txt += [k for k, v in pass2num.items() if v == int(i)][0]
        
    # 暗号化された文字列を表示する
    print(txt)
else:
    print("エラー")
상세한 설명은 평론에 쓰여 있으니 읽어 주십시오.
이 대응표는 아무리 해도 자기가 쓰고 싶지 않죠...(귀찮을까봐)

어떡하죠?


잠시 말하고 나서 컴퓨터의 문자인식이 어떻게 되는지 생각해 보자.
컴퓨터는 이진수(0과 1로 만든 숫자의 나열)로 모든 사물을 설명한다.
그렇다면 왜 프로그램이 일본어와 영어를 읽을 수 있게 하는가.
그것은 컴퓨터 (프로그램) 에 아까와 같은 대응표가 존재하기 때문이다.
여러 가지 이유가 있는데, 문자 코드는 이전(30년 전쯤)부터 다양한 것을 개발해 왔다.
일본어만 있는 사람도 있고 영어와 러시아어만 있는 사람도 있다.
특수문자(← 등)와 그림문자(🥺등) 덮어쓰는 것도 있습니다.
유니버설이라고 불리는 그 코드는 PC계에서 현재 가장 주류인 문자 코드다.
하지만 이번에는 영어 문자만 있기 때문에 영어 디지털 처리에서 가장 중요한 ASCII라는 문자 코드를 사용하고 싶습니다.
자세한 내용은 이쪽을 보세요.https://gihyo.jp/book/pickup/2019/0006
python의 표준 기능은 대응하는 숫자와 문자를 변환하는 것입니다.ord 함수와 chr 함수.
사용법에 대한 자세한 내용은 이쪽을 보십시오.https://qiita.com/ell/items/6eb48e934a147898d823

아름다운 예(가설해...⇔63;)


password = "abcd" # 必要な変数を定義
enc = "" # 数字化された文字列を入れる変数を定義
txt = "" # 暗号化された文字列を入れる変数を定義


if password.lower() == password: 
    # lowerで小文字にして元のpasswordと違うかを比べる。
    # これによって大文字が含まれているかがわかる(大文字があったらlowerで小文字にされるため)
    
    # 数字化をする
    for i in password: # これで1文字ずつpasswordの文字がiにaから順に文字が入っていく
        enc += str((ord(i)-97)*3%26) # ord関数を使って数値化する

    # 暗号化をする
    for i in enc: # これで1文字ずつencの文字がiにaから順に文字が入っていく
        txt += chr(int(i)+97) # chr関数を使って暗号化をする
        
    # 暗号化された文字列を表示する
    print(txt)
else:
    print("エラー")
이렇게 하면 예뻐진다.

4. 마지막


이 기사를 읽어 주셔서 감사합니다.
글의 오류를 발견하거나 문제가 있다면 해설을 써달라는 질문폐물이 있다면 연락 주시면 좋을 것 같습니다.

좋은 웹페이지 즐겨찾기