본문 바로가기
알고리즘/알고리즘 설명

기초 수학과 구현

by JayAlex07 2023. 5. 5.

🧑‍💻 기초 수학과 구현

멀티잇 코딩테스트 러닝클래스'Python 5월반

최장 맨해튼 거리

|x1 - x2| + |y1 - y2| 의 값이 최장 맨해튼 거리다

  • (x1, y1) , (x2, y2)

4개의 숫자가 주어지는데, 그 숫자로 만들 수 있는 제일 긴 맨해튼 거리를 만드는 것이다

permutations을 사용하여 주어진 4개의 숫자로 만들 수 있는 수열을 모두 구한다

  • 그리고 맨해튼 거리 공식을 이용하여, 최장 맨해튼 거리를 구하면 된다
from itertools import permutations

numbers = list(map(int, input().split()))
answer = 0

for i in permutations(numbers, len(numbers)):
    answer = max(answer, (abs(i[0] - i[2]) + abs(i[1] - i[3])))

print(answer)

🚨🚨 팁, permutations 말고, 4중 for문을 통해서 풀 수 있다

  • 단 4중 for문을 순회할 때에는, 중복되는 값이 없도록 한다

8진수 계산기

주어진 10 진수를 더하고, 더한 값을 8진수로 표시한다

while문을 사용하고, 8로 나눠서, 남은 값들을 eights 라는 리스트에 넣었다

eights[-1::-1] 을 해서, 숫자들을 뒤집어 준다

  • 리스트에 append를 썼기 때문에, 원래 답과는 반대로 숫자들이 나열되어 있다
num = int(input())
numbers = list(map(int, input().split()))

tens = sum(numbers)
eights = []

while tens > 0:
    num = tens % 8
    tens = tens // 8
    eights.append(num)

eights = ''.join(map(str, eights[-1::-1]))    

print(int(eights))

🚨🚨 bin(), oct(), hex() 라는 내장함수를 사용할 수 있다

  • bin() 은 이진수 / oct() 8진수 / hex() 16진수
  • 출력될 때에는 0b / 0o / 0x 가 붙어서 [2:] 부터 출력해줘야 한다

소수 찾기

주어진 수열에서, 소수 번째 숫자들을 모두 더하는 것이다

먼저 1부터 100,000번째 소수들을 구했다

그리고 구한 소수를 인덱스로 활용해서 문제를 풀었지만, FAIL(Timeout)이 있어서 틀렸다

# ---------------- 틀린 코드 --------------------

# 100,000까지 모든 소수 구하기
prime = set(range(2, 100001))

for i in range(2, 100001):    
    if i in prime:
        not_prime = set(range(2 * i, 100001, i))
        prime -= not_prime

# 수열을 받고, 수열 안에 있는 값들 더하기
N = int(input())
nums = list(map(int, input().split()))
answer = 0
i = 0

while N > list(prime)[i] - 1:

    answer += nums[list(prime)[i] - 1]
    i += 1

print(answer)

일단 제일 중요한 것은 모든 소수를 구할 때에, 시간을 줄이기 위해 for문에서 range의 범위를 반으로 줄였다

  • for i in range(2, 100002 // 2):
  • 1차적으로 소수 구하기를 할 때, 시간이 절약되었다

while문에서 for문으로 바꿨다

  • for문으로 구했던 소수를 순회할 수 있다고 생각해서, for문으로 바꿨다
# ---------------- 정답 코드 --------------------
# 100,000까지 모든 소수 구하기
prime = set(range(2, 100002))

for i in range(2, 100002 // 2):    
    if i in prime:
        not_prime = set(range(2 * i, 100002, i))
        prime -= not_prime

# 수열을 받고, 수열 안에 있는 값들 더하기
N = int(input())
nums = list(map(int, input().split()))
answer = 0

for i in prime:
    if N >= i:
        answer += nums[i - 1]
    else:
        break


print(answer)

'알고리즘 > 알고리즘 설명' 카테고리의 다른 글

완전 탐색  (0) 2023.05.11
시뮬레이션과 창의적 해결  (2) 2023.05.09
기초 문자열 구현  (0) 2023.05.04
Udemy : 동적 계획법 (DP)  (0) 2023.03.23
Udemy : 알고리즘 이분 탐색  (0) 2023.03.14