2022.06.21.

백준알고리즘 6~10단계 문제 피드백

(문제 - 단계별로 풀어보기 - 각 단계별 가장 정답 비율이 낮은 문제 풀기)

 

 

 

 

 

6단계 문제: 1157번. 단어 공부

A = input()
B = {}

for i in range(len(A)):
    X = A[i].upper()
    if X in B:
        B[X] = B[X] + 1
    else:
        B[X] = 1

max_str = ''
max = 0
for key, val in B.items():
    if val > max:
        max_str = key
        max = val
    elif val == max:
        max_str = '?'

print(max_str)

 

더 간단한 코드 (1)

 

A, B = input().lower(), []
for i in range(97, 123):
    B.append(A.count(chr(i)))
print('?' if B.count(max(B)) > 1 else chr(B.index(max(B)) + 97).upper())

 

더 간단한 코드 (2)

 

A = input().upper()
B = []

alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in alphabet:
    B.append(A.count(i))
if B.count(max(B)) > 1:
    print("?")
else:
    print(alphabet[B.index(max(B))])

 

전체 글자에 대해 'A, B, C, ...' 하나씩 수를 세어본 후

가장 큰 값을 출력하는 것이 더 빠름

 

 

 

 

 

7단계 문제: 1712번. 손익분기점

base, produce, sell = map(int, input().split())

diff = sell - produce
if diff <= 0:
    print(-1)
else:
    print(int(base/diff)+1)

 

 

 

 

 

8단계 문제: 1002번. 터렛

import sys

case = int(sys.stdin.readline())

for i in range(case):
    x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())

    if x1 == x2 and y1 == y2:
        if r1 == r2:
            print(-1)
        else:
            print(0)
    else:
        distance_xy = ((x2-x1)**2 + (y2-y1)**2)**0.5
        sum_r = r1 + r2
        if distance_xy < abs(r2 - r1):
            print(0)
        elif distance_xy == abs(r2 - r1):
            print(1)
        elif distance_xy > sum_r:
            print(0)
        elif distance_xy == sum_r:
            print(1)
        elif distance_xy < sum_r:
            print(2)

 

 

 

 

 

9단계 문제: 11729번. 하노이 탑 이동 순서

N = int(input())
K = [] # 이동 순서를 담을 리스트

# base: 시작점, goal: 목표점, support: 목표로 가기 위해 도와주는 점
def move(base, goal, support, stage, K):
    if stage == 1:
        K.extend([base, goal])
    else:
        K.extend([base, goal]) # K단계(K번째로 큰) 원판 이동
        
        # K-1개의 원판 탑 전체를 support(현재 원판 탑의 위치)에서
        # goal(K단계 원판이 있는 위치)로 이동하는 작업
        for i in range(stage - 1):
            curr_stage = i + 1
            if ((stage - 1) - curr_stage) % 2 == 0:
                move(support, goal, base, curr_stage, K)
            else:
                move(support, base, goal, curr_stage, K)


for i in range(N):
    stage = i + 1
    if (N - stage) % 2 == 0:
        move(1, 3, 2, stage, K)
    else:
        move(1, 2, 3, stage, K)

print(int(len(K)/2))
for i in range(int(len(K)/2)):
    print(K[2*i], K[2*i+1])

 

더 간단한 코드

 

N = int(input())
cache = {}

def move(base, goal, support, stage):
    if stage == 1:
        return f'{base} {goal}\n'
    if (base, goal, support, stage) in cache:
        return cache[(base, goal, support, stage)]
    else:
        curr = [move(base, support, goal, stage - 1),
                f'{base} {goal}\n',
                move(support, goal, base, stage - 1)]
        cache[(base, goal, support, stage)] = ''.join(curr)
        return cache[(base, goal, support, stage)]

print(2**N - 1)
print(move(1, 3, 2, N))

 

시작점, 목표점, 단계가 모두 같은 case를 cache에 저장한 후 꺼내어 사용

 

 

 

 

 

10단계 문제: 2231번. 분해합

N = input()

length = len(N)
N = int(N)
exist = 0


if length == 1:
    if N % 2 == 0:
        print(int(N / 2))
        exist = 1
elif N <= 18:
    for i in range(1, N):
        sum = i + i // 10 + i % 10
        if sum == N:
            print(i)
            exist = 1
            break
else:
    for i in range(N - length*9, N):
        sum = i
        for j in range(length):
            sum = sum + (i // (10 ** (length - j - 1)) % 10)
        if sum == N:
            print(i)
            exist = 1
            break


if exist == 0:
    print(0)

 

복사했습니다!