728x90
반응형

쉬운 문제지만 나는 해결하는데 조금 오랜 시간이 걸렸다.

a와 b에 각각 1을 더하고 2를 나누는데 a와 b의 결과가 값을 때까지 이 과정을 계속 반복하면 된다.

r, a, b = map(int, input().split())
cnt = 0
while(1):
    a = (a+1) // 2
    b = (b+1) // 2
    cnt += 1
    if a == b:
        flag = 0
        print(cnt)
        break

728x90
반응형
728x90
반응형

출력되어야 하는 값은 자기 자신과 1이 아닌 다른 약수를 가져야 하기 때문에 소수가 아닌 경우뿐이다.

소수가 아니라면 모든 수는 그 수의 약수 중 제일 작은 값과 제일 큰 값을 곱한 값과 같다.

EX) 6 -> 약수 [2, 3] -> 2 * 3 = 6

EX) 9 -> 약수 [3] -> 3 * 3 = 9

n = int(input())
li = list(map(int, input().split()))
li.sort()
ans = li[0] * li[-1]
print(ans)

728x90
반응형
728x90
반응형

처음에는 첫 번째 파일 이름과 두 번째 파일 이름 중에 다른 부분은?로 변환하고 그 결과를 뒤로 넘긴다.

넘어온 결과와 다음 파일 이름 앞에서 방식을 그대로 끝까지 반복하면 된다.

''.join()는 리스트를 합치는 역할을 한다.

EX) ''.join(['a',  'b', '?']) = 'ab?

n = int(input())
a = list(input())
l = len(a)
for _ in range(n-1):
    b = list(input())
    for i in range(l):
        if a[i] != b[i]:
            a[i] = '?'
print(''.join(a))

 

728x90
반응형
728x90
반응형

N*M 범위에서 제일 바꿀게 적은 8*8 영역을 찾아야 돼서 그런지 상당히 반복문을 많이 사용했다.

사실 영역을 찾는다기 보다는 전 영역에 8*8 크기의 필터를 돌려서 나오는 결과들 중 제일 작은 값이 답이다.

def jinho(li):
    c1 = ['WBWBWBWB', 'BWBWBWBW'] * 4    
    c2 = ['BWBWBWBW', 'WBWBWBWB'] * 4
    n1, n2 = 0, 0
    for i in range(8):
        for j in range(8):
            if c1[i][j] != li[i][j]:
                n1 += 1
            if c2[i][j] != li[i][j]:
                n2 += 1
    return min(n1, n2)

N, M = map(int, input().split())
li = []
for i in range(N):
    li.append(input())

ans = N*M
for n in range(N-7):
    for m in range(M-7):
        t_li = []
        for i in range(8):
            t = []
            for j in range(8):
                t.append(li[i+n][j+m])
            t_li.append(t)
        ans = min(ans, jinho(t_li))
print(ans)

728x90
반응형
728x90
반응형

쉬운 문제인 것 같은데 뭔가 복잡하다.

정렬과 인덱스를 사용해서 풀면 된다.

n = int(input())
t = list(map(int, input().split()))
s_li = sorted(t)
li = []
for i in range(n):
    idx = s_li.index(t[i])
    li.append(idx)
    s_li[idx] = -1
print(*li)

728x90
반응형
728x90
반응형

단순 수학 문제이다. 조합 공식을 사용하면 쉽게 풀 수 있다.

EX) N = 13, M = 29 라면 29C13을 계산하면 된다.

def f(n):
    if n == 1 or n == 0:
        return 1
    return n * f(n-1)

for _ in range(int(input())):
    r, n = map(int, input().split())
    ans = f(n) // f(r) // f(n-r)
    print(ans)
728x90
반응형
728x90
반응형

10 이하의 자연수의 거듭제곱의 첫 자릿수를 보면 항상 주기가 있다.

EX) 2의 경우, 2, 4, 8, 16, 32, 64, 128, 256,... 과 같이 2, 4, 8, 6이 반복된다.

1, 5, 6은 맨 뒷자리 수가 항상 자기 자신이므로 입력으로 들어오면 입력 그대로 출력해주고

0의 경우 1, 5, 6과 같은 경우지만 10을 출력해야 됨으로 따로 처리한다.

다른 수들의 경우는 주기가 끝날 때까지 거듭제곱들의 첫 자릿수를 리스트에 저장한다.

그 후는 b를 주기로 나는 나머지 번째 리스트 값이 정답이다.

EX) a = 3, b = 7의 경우 [3, 9, 7, 1]가 리스트로 저장되고 b를 4(주기)로 나눈 3번째 리스트 값(7)이 정답이다.

for i in range(int(input())):
    a, b = input().split()
    a, b = int(a[-1]), int(b)
    if a == 1 or a == 5 or a == 6:
        print(a)
        continue
    elif a == 0:
        print(10)
        continue
        
    result_li = []
    t = 1
    for _ in range(b):
        t *= a
        t %= 10
        if t in result_li:
            break
        result_li.append(t)
    ans = result_li[b % len(result_li) - 1]    
    print(ans)

728x90
반응형
728x90
반응형

그냥 나눠서 출력하면 된다.

a, b = map(float, input().split(" "))
result = a / b
print(result)

728x90
반응형
728x90
반응형

터렛에서는 ** 0.5를 해서 제곱근을 구했었는데, 보기 좋게 math 라이브러리를 사용하기로 했다.

행성계와 시작, 행성계와 끝의 거리를 구하고 행성계의 반지름과 비교하면 된다.

행성계와 시작 사이의 거리를 d1, 행성계와 끝 사이의 거리를 d2, 행성계의 반지름을 r이라 하자.

d1, d2 둘 다 r 보다 작으면 행성계는 시작과 끝 둘 다 포함하지 못해서 경로에 포함되지 않고

반대로 d1, d2 둘 다 r 보다 크면 행성계가 시작과 끝 둘 다 포함하기 때문에 경로에 포함되지 않는다.

결국 행성계 안에 시작과 끝 지점 둘 중 하나만 속해 있다면 경로에 포함된다는 것이다.

# ^는 xor 비트 연산자이다.

from math import sqrt

for _ in range(int(input())):
    x1, y1, x2, y2 = map(int, input().split())
    s, e = [x1, y1], [x2, y2]
    ans = 0
    for i in range(int(input())):
        x, y, r = map(int, input().split())
        d1 = sqrt((x-x1)**2 + (y-y1)**2)
        d2 = sqrt((x-x2)**2 + (y-y2)**2)
        if (d1 < r) ^ (d2 < r):
            ans += 1
    print(ans)

728x90
반응형
728x90
반응형

출력되는 0과 1의 개수도 피보나치 수열을 따른다.

기본적인 다이나믹 프로그래밍 문제이다.

EX) 입력이 3일 때, 1의 결과 (0, 1)과 2의 결과 (1, 1)을 더한 (1, 2)가 답이다.

피보나치수열의 2차원 버전이 아닐까 라는 생각이 든다.

리스트를 그대로 출력하면 오답이니 인자들만 꺼내 주는 *를 사용하도록 하자

def s(a, b):
    t1 = a[0] + b[0]
    t2 = a[1] + b[1]
    return [t1, t2]

for _ in range(int(input())):
    a, b = [0, 1], [1, 0]
    n = int(input())
    if n == 0:
        print(*b)
    elif n == 1:
        print(*a)
    else:
        for i in range(n-1):
            a, b = s(a, b), a
        print(*a)
728x90
반응형
728x90
반응형

풀이 방법은 원의 교점의 개수를 세는 것이다.  

석원과 규현이 같은 위치에 있고 반지름이 같다면 같은 원이므로 교점의 개수는 무한.  

반지름의 합 또는 차가 석원과 규현의 거리와 같다면 두 원의 접하는 것이므로 교점은 1개.  

반지름의 합이 석원과 규현의 거리보다 작거나, 반지름의 차가 석원과 규현의 거리보다 크다면  

두 원의 접하지 않으므로 교점은 0개.  

그 이외의 경우는 원이 두 점에서 만난다.  

 

for _ in range(int(input())):   
    li = list(map(int, input().split()))   
    p1 = li[:2]   
    r1 = float(li[2])   
    p2 = li[3:5]   
    r2 = float(li[5])   
    r = ((p2[0]-p1[0])**2 + (p2[1]-p1[1])**2) ** 0.5   
    if p1 == p2 and r1 == r2:   
        print(-1)   
    elif r1+r2 == r or abs(r1-r2) == r:   
        print(1)    
    elif r1+r2 < r or abs(r1-r2) > r:   
        print(0)   
    else:   
        print(2)  

728x90
반응형
728x90
반응형

a, b = map(int, input().split())
print(a-b)

728x90
반응형
728x90
반응형

A, B = map(int, input().split())
print(A + B)

 

백준 알고리즘을 처음으로 시작한 사람들이 이 문제를 보게 될 것인데 

python을 사용하는 경우 입력 받을 때 map이나 split을 엄청 많이 사용하게 될 것이니 

유용하게 사용하시길 바랍니다.

728x90
반응형

+ Recent posts