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

43776 ワード

📝に質問文字列の再配置


-質問


これがコードテストとPython(羅東彬著)書p.322題です
大文字と数字(0~9)からなる文字列を入力します.すべてのアルファベットが昇順に並べられ、出力され、すべての数値が加算された値が出力されます.例えば、K 1 KA 5 CB 7という値を入力すると、ABCK 13が出力される.
入力
最初の行は文字列Sを与える.(1<=Sの長さ<=10000)
しゅつりょく
最初の行は問題の要求の答えを出力します.
入力例
K1KA5CB7
出力例
ABCKK13
入力例2
AJKDLSI412K4JSJ9D
出力例2
ADDIJJJKKLSS20

-私のコード💻

s = input()
alpha = []
num = []

for i in s:
    if ord('A') <= ord(i) <= ord('Z'):
        alpha.append(i)
    elif 0 <= int(i) <= 9:
        num.append(int(i))

alpha.sort()
alpha.append(str(sum(num)))
print("".join(alpha))

-答えコード💻

data = input()
result = []
value = 0

#문자를 하나씩 확인하며
for x in data:
    #알파벳인 경우 결과 리스트에 삽입
    if x.isalpha():
        result.append(x)
    #숫자는 따로 더하기
    else:
        value += int(x)
    
#알파벳 오름순 정렬
result.sort()

#숫자가 하나라도 존재하는 경우 가장 뒤에 삽입
if value != 0:
    result.append(str(value))

#최종 결과 출력(리스트 -> 문자열 변환 출력)
print(''.join(result))

-比較分析📖


isalpha()がアルファベットかどうかを区別する簡単な文法が思いつかない.だからord()でアルファベットかどうかを区別します.そして、数字が一つもないとは思わなかった.

✔¥コンセプト復習


"".join(リスト)->リストを文字列に変換します.
isaplha()->アルファベットかどうかを区別します.

📝問題2。白駿18406号(ラッキー直道)


-質問


https://www.acmicpc.net/problem/18406
一部のゲームの外ボクサー役には幸運直という技術がある.この技術は、常に強力な機能に代わるものではなく、現在のゲームで点数が特定の条件を満たす場合にのみ使用できます.
特定の条件とは、現在のキャラクタのスコアがNの場合、スコアNが小数点以下を基準にして2つに分割され、左小数点以下の和が右小数点以下の和に加算された値と同じ場合です.たとえば、現在のスコアが123402の場合、左側の各ビット数の合計は1+2+3であり、右側の各ビット数の合計は4+0+2であるため、2つの合計は6であり、プライマリ・キー・ストレートを使用することができる.
現在のスコアがNの場合は、利用可能なラッキーツリーがあるかどうかを示すプログラムを作成します.ラッキーストレートが使用可能な場合は「LUCKY」、できない場合は「READY」を出力します.また、スコアNのビット数は常に偶数で与えられる.たとえば、ビット数5の12345は入力入力入力として入力されません.
入力
1行目の分数Nは整数である.(10≦N≦99999999)しかし、スコアNのビット数は常に偶数で与えられる.
しゅつりょく
最初の行が幸運直を使用できる場合は「LUCKY」、できない場合は「READY」を出力します.

-私のコード💻

data = input()
length = len(data) // 2
firstsum = 0
secondsum = 0

for i in range(0, length):
    firstsum += int(data[i])

for i in range(length, len(data)):
    secondsum += int(data[i])

if firstsum == secondsum:
    print("LUCKY")
else:
    print("READY")

-プロセス📖



📝に質問白駿4673号(セルフサービス番号)


-質問


https://www.acmicpc.net/problem/4673
セルフサービス番号は1949年にインドの数学者D.R.Kaprekarによって命名された.正の整数nについて、d(n)がnおよびnの各ビット数の関数を定義する.例えば、d(75)=75+7+5=87である.
正の整数nが与えられると、その数からn、d(n)、d(d(n)、d(d(d(n))、...無限数列を生成できます.
たとえば、33で始まると、次の数字は33+3+3=39、次の数字は39+3+9=51、次の数字は51+5+1=57となります.このようにして、次の数の列を生成できます.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
nをd(n)の生成者と呼ぶ.上の数列において、33は39の生成者、39は51の生成者、51は57の生成者である.生成者が1つより多い場合もあります.例えば、101には2つの構造関数(91および100)がある.
生成されていない数字を自動番号と呼びます.100未満のセルフサービス番号は全部で13個です.1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000以下のセルフ・サービス番号を出力するプログラムを作成します.
入力
入力していません.
しゅつりょく
10000以下の自己符号を行ごとに1つ追加する順序で出力します.

-私のコード💻

  • 最初のコード->失敗
  • array = []
    for i in (1, 10001):
        array.append(i)
    
    newArray = []
    for i in array:
        if len(str(array[i])) == 1:
            k = array[i] + array[i]
            newArray.append(k)
        elif len(str(array[i])) == 2:
            k = array[i] + array[i]//10 + array[i]%10
            newArray.append(k)
        elif len(str(array[i])) == 3:
            k = array[i] + array[i]//100 + array[i]//100//10 + array[i]%10
            newArray.append(k)
        elif len(str(array[i])) == 4:
            k = array[i] + array[i]//1000 + array[i]//1000//100 + array[i]//1000//100//10 + array[i]%10
            newArray.append(k)
        else:
            break
    
    newSet = set(newArray)
    originSet = set(array)
    originSet = originSet - newSet
    array = list(originSet)
    
    for i in array:
        print(i)
  • 最後のコード->成功!
  • # 1부터 1000까지 저장
    array = []
    for i in range(1, 10001):
        array.append(i)
    
    # 생성자로 인해 만들어지는 수열을 저장할 리스트
    newArray = []
    m = 0
    
    for i in array:
        iStr = str(i)
        
        # 각 자리의 수를 더하는 반복문
        for k in range(len(iStr)):
            m += int(iStr[k])
        m += i  # 각 자리의 수를 더한 값에 원래값을 더해줌
        newArray.append(m)  # 리스트에 추가
        m = 0  # m값 초기화
    
    # 셀프 넘버 구하기 (각 리스트를 set로 변환한 뒤 차집합 구하기)
    # set로 변환하는 과정에서 중복된 값이 제거된다.
    selfnum = set(array) - set(newArray)
    array = list(selfnum)
    array.sort()  # 오름차순 정렬
    
    for i in array:
        print(i)

    -比較分析📖


    位置ごとの数を増やす方法を考えましたが、なんだか難しいので、複雑なコードで答えて、グーグル検索で方法を探しました.その結果、数字を文字列(配列)に変換し、文字列の長さで繰り返し、各ビット数を加算する方式になります.
    昨日setのコンセプトを勉強して、車の集合を整理して、この問題に適用すればいいと思ったので、応用してみました.幸いにもよく動いた.
    そして繰り返し文を書くときはいつもrange()を書くのを忘れてしまいます.rangeを使っていないので結果値が1と10001しかないのでパニック…!コードにエラーがあると思いましたが、rangeを使用していないために問題が発生しました.また,変数名をどのように与えるかも考えなければならない.

    📝に質問白駿3190号(蛇)


    -質問


    https://www.acmicpc.net/problem/3190
    「Dummy」というドスゲームがありました.このゲームには蛇が這い出していて、りんごを食べると蛇の長さが増えます.ヘビが這い回って、壁や自分の体にぶつかって、ゲームは終わりました.
    ゲームはNxN正方形の碁盤で行われ、一部の格にはりんごが置かれている.板の上下左右端に壁があります.ゲーム開始時、ヘビは一番上の一番左側にあり、ヘビの長さは1です.蛇は最初は右です.
    ヘビは毎秒移動し、次のルールに従います.
  • まず蛇の体長を伸ばし、頭を下の段に置く.
  • 移動した格子の中にリンゴがあれば、格子の中のリンゴは消え、しっぽも動かない.
  • 移動した格子にリンゴがなければ、体の長さを短くして尻尾のある格子を空けます.つまり、身長は変わらない.
  • リンゴの位置と蛇の移動経路が与えられると、このゲームは数秒で終了する.
  • 入力
    最初の行は、プレートのサイズNを与える.(2≦N≦100)次の行はリンゴの個数Kを与える.(0 ≤ K ≤ 100)
    次のK行はリンゴの位置を示し,1番目の整数は行を表し,2番目の整数は列の位置を表す.りんごの位置が違います.一番上の左側(1行1列)にはりんごがありません.
    次の行は蛇の方向転換回数Lを与える.(1 ≤ L ≤ 100)
    以下のL行は蛇の方向変換情報を提供し,整数Xと文字Cからなる.ゲーム開始時間からX秒終了後に左(Cは「L」)または右(Cは「D」)に90度回転します.Xは10000以下の正の整数であり、方向変換情報はXが増加する順に与えられる.
    しゅつりょく
    1行目の出力ゲームは数秒で終了します.

    -私のコード

    n = int(input())  # 보드의 크기
    board = [[0] * n for _ in range(n)]  # nXn 보드 생성, 0으로 초기화
    
    k = int(input())  # 사과의 개수
    for _ in range(k):
        x, y = map(int, input().split())
        board[x][y] = 3  # 사과 있는 곳 표시
    
    L = int(input())  # 방향 변환 횟수
    rotate = []
    for _ in range(L):
        rotate.append(list(map(str, input().split())))
    
    # 북, 동, 남, 서 방향정의 (상 우 하 좌)
    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]
    direction = 1  # 초기 방향 : 오른쪽
    
    
    def turn_left():
        global direction
        direction -= 1
        if direction == -1:
            direction = 3
    
    
    def turn_right():
        global direction
        direction += 1
        if direction == -1:
            direction = 3
    
    time = 0
    
    
    
    
    if dx < 1 or dy < 1 or dx > n or dy > n :
        print(time+1)
    
    
    ->あきらめ、、、

    -答えコード💻

    # 끝을 만났을 때는 die
    # apple -> 몸길이 +1,
    # (0,0)부터 시작
    
    def Solution():
        time = 0
        # 북동남서
        snake_array = []
        direction = {0:(0,1), 1:(1,0),2:(0,-1),3:(-1,0)}
        dir = 0 # 동쪽
    
        # empty:0, 사과:1, 뱀:2
        nx,ny = 0,0
        board[0][0] = 2 # start
        snake_array.append([0,0])
    
        # 끝날때까지 돌기
        while(1):
            time += 1
            nx = nx + direction[dir][0]
            ny = ny + direction[dir][1]
      
            if not 0<= nx <N or not 0<= ny <N:
                 break
    	
        	# apple
            if board[nx][ny] == 1:
                board[nx][ny] = 2 # 머리 이동
                snake_array.append([nx,ny])
    
            # empty
            elif board[nx][ny] == 0:
                board[nx][ny] = 2
                snake_array.append([nx,ny])
                del_x, del_y = snake_array.pop(0)
                board[del_x][del_y] = 0
    
            # snake 몸통
            elif board[nx][ny] == 2:
                break
    
            if len(snake_dir) != 0 and time == snake_dir[0][0]:
                    time, new_dir = snake_dir.pop(0)
                    if new_dir == 'L': # 왼쪽
                        dir = (dir + 3) % 4
                    elif new_dir == 'D':
                        dir = (dir + 1) % 4
    
        return time
    
    # 오른쪽/ 왼쪽 방향 바꾸는 건 % 연산자 이용하여 쉽게 할 수 있음
    # 왼쪽으로 돌리기 = (현재 방향 + 3) % 4
    # 오른쪽으로 돌리기 = (현재 방향 + 1) % 4
    # board
    N = int(input())
    board = [[0 for i in range(N)] for j in range(N)]
    
    # apple 넣기
    k = int(input())
    apple_locs = []
    for _ in range(k):
        x, y = map(int, input().split())
        board[x-1][y-1] = 1
    
    # snake 시간, 방향
    l = int(input())
    # (sec, c(left) or d(right))
    snake_dir = list(map(lambda x:[int(x[0]),str(x[1])],\
                         [input().split() for _ in range(l)])) 
    print(Solution())

    -比較分析📖


    頑張って解いてみましたが、難しすぎて、真ん中のPo~記、週末は必ず復習して、どんな感じかわかるような気がしますが、感覚しか知らないようで、東西南北方向と左右の回転を結びつけるのはちょっと難しいです.
    https://velog.io/@dlgk0205/Python-%EB%B0%B1%EC%A4%80-3190%EB%B2%88-%EB%B1%80
    注意:ブログ、、、