[Python] 알고리즘 - 4

2024. 1. 17. 11:24· 프로그래밍/알고리즘
목차
  1. 개인 공부 목적 - 참고만 하시는걸 추천드립니다.
  2. [다음 입사문제] 최근접쌍
  3. [아마존 면접문제] 정렬
  4. (구글 면접문제) Special Sort
  5. Lotto Simulation
  6. 빈도수 체크
  7. 에라토스테네스의 체(소수 출력)
  8. 파스칼삼각형
  9. <문제> 시각: 문제 설명
반응형

개인 공부 목적 - 참고만 하시는걸 추천드립니다.

[다음 입사문제] 최근접쌍

  • 1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오
  • 예를들어 S=[13, 20, 8, 4, 1, 17, 3] 이 주어졌다면, 결과값은 (3, 4)가 될 것이다.
  • Hint) 정렬 후 인접쌍 거리 체크
def func(lst:list) -> list:
  tmp = {}
  lst.sort()
  for i in range(len(lst) - 1):
    tmp[lst[i], lst[i+1]] = lst[i+1] - lst[i]
  return list(min(tmp, key=tmp.get))

print(func([13,20,8,4,1,17,3]))

Untitled.png

[아마존 면접문제] 정렬

  • 다음과 같은 형태의 배열을
  • [a1,a2,a3...,an,b1,b2...bn] 다음과 같은 형태로 바꾸시오
  • [a1,b1,a2,b2.....an,bn]
def reverse_lst(lst:list) -> list:
  res = []
  for i in range(0, len(lst)//2):
    res.append(lst[i])
    res.append(lst[len(lst)-(len(lst)//2-i)])
  return res

print(reverse_lst(['a1', 'a2', 'a3', 'an', 'b1','b2','b3', 'bn']))

Untitled.png

(구글 면접문제) Special Sort

  • n개의 정수를 가진 배열이 있다. 이 배열은 양의정수와 음의 정수를 모두 가지고 있다. 이제 당신은 이 배열을 좀 특별한 방법으로 정렬해야 한다.
  • 정렬이 되고 난 후, 음의 정수는 앞쪽에 양의정수는 뒷쪽에 있어야 한다. 또한 양의정수와 음의정수의 순서에는 변함이 없어야 한다.
  • 예. -1 1 3 -2 2 ans: -1 -2 1 3 2.
def func(lst:list) -> list:
  res = []
  for i in range(len(lst)):
    if lst[i] < 0:
      res.append(lst[i])

  for j in range(len(lst)):
    if lst[j] > 0:
      res.append(lst[j])

  return res

print(func([-1, 1, 3, -2, 2]))

Untitled.png

Lotto Simulation

  • 1~5사이의 정수 3개를 중복없이 입력 받아, 자동 발생시킨 로또 번호와 비교 (실행예) 로또 번호 입력 : 1 2 3
  • 자동 발생 번호 : 1 3 5

Untitled.png

import random

def lotto() -> str:
  while True:
    a = random.randint(1, 5)
    b = random.randint(1, 5)
    c = random.randint(1, 5)
    if a != b and a != c and b != c:
      break
  return ' '.join(map(str, (a, b, c)))

user1, user2, user3 = map(int, input('로또 번호 입력 : ').split())

print("자동 발생 번호 :", lotto())

Untitled.png

  • (추가실습) 로또 결과를 출력하시오 (실행예) 결과 : 숫자 2개 일치
inval = True
import random

def lotto() -> str:
  while True:
    a = random.randint(1, 5)
    b = random.randint(1, 5)
    c = random.randint(1, 5)
    if a != b and a != c and b != c:
      break
  return a,b,c

def chk(user1:int, user2:int, user3:int) -> int:
  cnt = 0
  lst = list(lotto())
  user_lst = [user1, user2, user3]
  lst.sort(); user_lst.sort()
  for i in range(3):
    if lst[i] == user_lst[i]:
      cnt += 1
  return cnt

while (inval == True):
  user1, user2, user3 = map(int, input('로또 번호 입력 : ').split())
  if user1 > 5 or user2 > 5 or user3 > 5 or user1 < 1 or user2 < 1 or user3 < 1:
    print("1~5사이의 정수로 입력해주세요")
  else:
    inval = False
    break


if(inval == False):
  print("숫자",chk(user1, user2, user3),"개 일치")

Untitled.png

빈도수 체크

  • 크기 n인 배열을 [1~100) 난수로 초기화 Bin 크기 입력 각 Bin에 포함된 숫자의 개수 출력
  • 실행 예) 배열의 크기 입력 : 100 Bin 크기 입력 : 3 각 Bin에 포함된 숫자의 개수 = [33, 37, 30]
import random

def rand(n:int) -> int:
  lst = [random.randint(1,100) for i in range(n)]
  return lst

def eq(n:int, bin:int) -> list:
  res = []
  rand_lst = rand(n)
  for i in rand_lst:
    if str(bin) in str(i):
      res.append(i)
  return res

n = int(input('배열의 크기 입력 : '))
bin = int(input("Bin 크기 입력 : "))
lst = eq(n, bin)
print("각 Bin에 포함된 숫자의 개수 =", lst)

Untitled.png

에라토스테네스의 체(소수 출력)

  • 2부터 시작해 자연수를 차례로 쓴 다음 합성수를 제거
  • 배열 활용
    • 인덱스를 자연수라 가정, 1로 모두 초기화
      • 인덱스 0, 1의 원소는 활용 안함
    • 자연수 i(인덱스)가 합성수이면 0으로 지움
  • 메소드 작성
    • delete(lst : list, i : int)
      • 리스트 lst에서 정수 i의 배수를 모두 지움

Untitled.png

def composite(n:int) -> int:
  res = []
  for i in range(1, n+1):
    if n % i == 0:
      res.append(i)

  if len(res) >= 3:
    return 0
  else:
    return 1

def delete(dic, i:int):
  for j in range(len(dic)):
    if dic[j] % i == 0:
      del dic[j]
  return dic


dic = {}
for i in range(0, 20):
  dic[i] = composite(i)

print(delete(dic, 2))

Untitled.png

파스칼삼각형

  • 지수 n을 입력받아 이항계수를 출력하는 프로그램 작성 (실행예)
    • 지수를 입력 : 4
    • 이항계수 : 1 4 6 4 1

Untitled.png

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

def func(n, k):
    return factorial(n) // (factorial(k) * factorial(n - k))

n = int(input('지수를 입력 : : '))
res = [func(n, k) for k in range(n+1)]
print("이항계수 : ",res)

Untitled.png

<문제> 시각: 문제 설명

  • 정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성하세요. 예를 들어 1을 입력했을 때 다음은 3이 하나라도 포함되어 있으므로 입니다.
    • 00시 00분 03초
    • 00시 13분 30초
  • 세어야 하는 시각
  • 반면에 다음은 3이 하나도 포함되어 있지 않으므로 입니다.
    • 00시 02분 55초
    • 01시 27분 45초
  • 세면 안 되는 시각

→ 구현 : 시뮬레이션과 완전 탐색

Untitled.png

# 정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중 3이 하나라도 포함되는 모든
# 경우의 수를 구하는 프로그램
def time(n:int) -> int:
  res = 0
  for hour in range(0, n+1):
    for minute in range(0, 60):
      for second in range(0, 60):
        if '3' in str(hour) + str(minute) + str(second):
          res += 1

  return res

n = int(input("입력 : "))
print("3이 포함된 모든 경우의 수 : ",time(n))
반응형
  1. 개인 공부 목적 - 참고만 하시는걸 추천드립니다.
  2. [다음 입사문제] 최근접쌍
  3. [아마존 면접문제] 정렬
  4. (구글 면접문제) Special Sort
  5. Lotto Simulation
  6. 빈도수 체크
  7. 에라토스테네스의 체(소수 출력)
  8. 파스칼삼각형
  9. <문제> 시각: 문제 설명
'프로그래밍/알고리즘' 카테고리의 다른 글
  • [Python] 알고리즘 - 3
  • [Python] 알고리즘 - 2
  • [Python] 알고리즘 - 1
Future0_
Future0_
rm -rf /
Future0_
Luna Developer Blog
Future0_
전체
오늘
어제
  • 분류 전체보기 (112)
    • 프로그래밍 (4)
      • 알고리즘 (4)
    • 보안 (14)
      • Dreamhack (4)
      • Hackthebox (1)
      • Webhacking (9)
    • 프로젝트 (4)
    • 공부 (80)
      • Database (2)
      • Python (11)
      • System (4)
      • Java (13)
      • JSP (13)
      • Spring (11)
      • Kotlin (16)
      • 자료구조 (10)
      • 기계학습 (0)
    • Docker (4)
    • Github (2)
    • Tip (1)
    • 잡담 (2)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • api 통신
  • Computer science
  • cs
  • shared preference
  • spring
  • android studio 삭제
  • 코틀린기본문법
  • 보안
  • dreamhack
  • jsp
  • 디버깅키해시
  • 1.9.22
  • 자바빈즈
  • Java
  • Kotlin
  • SpringBoot
  • Database
  • 자료구조
  • 상속
  • docker
  • 컴퓨터
  • native app
  • 알고리즘
  • 프로그래밍
  • webhacking
  • React
  • Python
  • Android Studio
  • ViewModel
  • 키 해시

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
Future0_
[Python] 알고리즘 - 4
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.