목록Algorithm (111)
Sunrise
수학 문제입니다. H, W, N을 받고 N번째 손님이 방에 들어가는 규칙을 살펴봅니다. ex) H=5, W=6 받은 경우 5 10 15 4 9 14 3 8 13 2 7 12 1 6 11 501 502 503 401 402 403 301 302 303 201 202 203 101 102 103 왼쪽 숫자 층 규칙을 보면 N % H 인데 N % H = 0 인 경우는 H 꼭대기 층입니다. 오른쪽 호수 규칙을 보면 N // H + 1 인데 N % H = 0 인 경우 N // H 입니다. T = int(input()) for _ in range(T): H, W, N = map(int, input().split()) if N % H == 0: # N이 H 배수일 때 floor = H # H 꼭대기 층 num = N..
수학 문제입니다. ''' 주어진 시간보니 반복문 못돌림 단순 값을 구할 수 있는 연산으로 해결해야 함 V-B (완주 가능한 마지막 높이) A-B (하루 올라갈 수 있는 높이) V-B / A-B = 소요 시간 만약 소요 시간이 정수면, 완주 전날 완주 가능한 마지막 높이에 도달 정수가 아니라면, 완주 전날 완주 가능한 마지막 높이에 도달하지 못함 -> 올림 처리 ex) 10 5 25 => 20 (완주 가능한 마지막 높이) 10 5 26 => 21 (완주 가능한 마지막 높이) 10 5 / 15 10 / 20 15 / 25 10 5 / 15 10 / 20 15 / 25 20 / 30 4.0일 -> 4일 4.2일 -> 5일 ''' import math A, B, V = map(int, input().split(..
수학 문제입니다. 숫자 X를 받고 num에 cnt를 더해가면서 num이 X와 같거나 넘어선 순간 cnt를 구합니다. cnt는 숫자가 속한 층(layer)을 의미합니다. 층별로 num이 위치한 방향이 있는데, 이는 아래 표와 같이 cnt의 짝수/홀수에 따라 바뀝니다. num이 위치한 방향에 따라 분자, 분모를 정해주고 차이나는 칸 num-X만큼 더하거나 빼면 답을 구할 수 있습니다. cnt num 시작점 방향 시작점과의 거리 (dist) 1 1 - - 2 1+2 left num-X 3 1+2+3 right num-X 4 1+2+3+4 left num-X 1 2 6 7 15 3 5 8 14 4 9 13 10 12 11 1/1 1/2 1/3 1/4 1/5 2/1 2/2 2/3 2/4 3/1 3/2 3/3 4/..
수학 문제입니다. 숫자 N을 받고 num에 6의 배수를 더해가면서 num이 N과 같거나 넘어선 순간 cnt를 구합니다. cnt+1은 몇 개의 방을 지났는지 의미합니다. cnt num 0 1 1 1+6 2 1+6+12 3 1+6+12+18 N = int(input()) cnt = 0 num = 1 while (1): if num >= N: # N이 1, 7, 19, 37..인 경우 그 숫자까지는 다 break break else: cnt += 1 num += 6 * cnt print(cnt + 1)
문자열 문제입니다. 문자열로 받은 word에 대해서, word[j]와 word[j+1]가 같은지 비교합니다. j+1 인덱스 에러 안나려면 len(word)-1 word[j]와 word[j+1]이 같다면 문제 될게 없으므로 pass로 다음 for문 넘어가기 word[j]와 word[j+1]이 다르다면, word[j]가 그 이후 문자열에 있는지 확인 → word[j] in word[j+1:] 이후 break로 뒷 문자열에서 중복으로 값 빠지는 것 방지 N = int(input()) count = N for i in range(N): word = input() for j in range(0, len(word)-1): if word[j] == word[j+1]: pass elif word[j] in word[j..
수학 문제입니다. 가로수들을 최소로 배치하는 간격을 구하기 위해서는 주어진 가로수 위치들의 간격들을 구하고 그 간격들의 최대공약수를 구하면 됩니다. ex) 1, 3, 7, 13 → 2, 4, 6 의 간격을 갖는데 가로수를 최소로 배치하기 위해서는 최대공약수 2로 간격을 정하면 됌 따라서 주어진 수로부터 간격 리스트를 구하고, 그 리스트에서 최대공약수 g를 구합니다. 간격 리스트에 들어있는 수들을 간격 g로 나누고 1을 빼서, 필요한 가로수 개수를 더해 나갑니다. ex) 1, 3, 7, 13 → 2, 4, 6 → a // a // * // a // * // * // a → 0개, 1개, 2개 필요 식으로 나타내면, (2//2-1) + (4//2-1) + (6//2-1) = 0 + 1 + 2 = 3 impo..
DFS, 백트래킹 문제입니다. - 스타트, 링크 두 팀으로 나누기 위해서 가능한 팀 조합 경우를 방문처리 해주면서 dfs 재귀함수 형태로 만듭니다. - 팀원이 N//2명으로 모두 채워지면 능력치 stat1, stat2의 차이를 구합니다. - 모두 방문처리 될 때까지 stat1, stat2의 절댓값 차이를 최소값으로 계속 갱신합니다. def dfs(depth, idx): global min_diff if depth == N//2: # 한 팀에 속한 팀원 수가 N//2로 다 채워지면, stat1, stat2 = 0, 0 for i in range(N): for j in range(N): if visited[i] and visited[j]: # T T 인 경우 stat1 += S[i][j] elif not v..
수학 문제입니다. M이상 N이하이므로, for문 범위는 M ~ N+1입니다. 소수 판별함수 is_prime을 구현하여 소수일때만 i를 출력합니다. 소수판별 함수에서, i를 x까지 모두 나누면 문제 조건 상 시간초과가 납니다. 약수가 짝을 이루어 구해지는 성질을 고려하면 x의 제곱근까지만 i를 나누어도 소수인지를 판별할 수 있습니다. M, N = map(int, input().split()) def is_prime(x): if x == 1: return False for i in range(2, int(pow(x, 0.5))+1): if x % i == 0: return False return True for i in range(M, N+1): if is_prime(i): print(i)
수학 문제입니다. N의 진짜 약수는 N의 약수들 중 1과 N이 아닌 나머지 약수입니다. 약수 배열이 주어지므로, 약수가 짝을 이루어 곱해지면 원래 수가 나오는 성질을 이용해서 원래 수를 구합니다. N = int(input()) n_list = list(map(int, input().split())) print(max(n_list) * min(n_list))
대표적인 백트래킹 문제입니다. 8퀸 문제를 일반화한 것으로 NxN 체스판에 N개의 퀸을 서로 공격할 수 없게 놓아야 합니다. - 복잡한 2차원 배열 대신에 행-인덱스, 열-값으로 1차원 배열 row[0] * N을 선언합니다. ex) 1행 2열 → row[1] = 2 - NxN 완전 탐색을 위한 dfs 함수와 탐색 위치에 두었을 때 퀸이 안전한지 확인하는 is_promising 함수를 생성합니다. - dfs에서는, x행 모든 열에 대해서 row[x] = i, 즉 [x, i]에 퀸을 두고 나서 is_promising 확인 → 안전하면 다음 x+1행으로 넘어가서 다시 dfs 탐색 시작 → 안전하지 않으면 다음 열에서 안전한지 확인 그러다 0~N-1 행에 모두 둬서 N개 채우고 is_promising 통과해서 ..