용꿀
꼬마개발자허니
용꿀
전체 방문자
오늘
어제
  • 분류 전체보기 (247)
    • 개발 (74)
      • 스프링 입문 (7)
      • 스프링 기본 (9)
      • ToDo List using JPA (2)
      • 스프링 개념 (9)
      • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (8)
      • 스프링 MVC (3)
      • CS (18)
      • 개발 팁 (8)
      • 스프링 MSA (5)
      • 곰터뷰🐻 (5)
    • 알고리즘 (169)
      • 알고리즘 문제 풀이 (165)
    • 잡동사니 (1)
      • 노래 가사 (1)
hELLO · Designed By 정상우.
용꿀

꼬마개발자허니

(Python) 백준 10816번 - 숫자 카드 2
알고리즘/알고리즘 문제 풀이

(Python) 백준 10816번 - 숫자 카드 2

2023. 1. 10. 00:45

 

문제 링크 : https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

풀이

1. lower bound와 upper bound를 사용한 풀이

lower bound와 upper bound를 사용하여 해당 값이 존재하는 위치의 수를 계산하는 방식으로 문제 풀이를 진행했다. 

import sys

def lower(arr, num): # lower bound : 해당 값이 처음으로 나타나는 인덱스 반환
    low, high = 0, len(arr)
    while low < high:
        mid = (low+high)//2
        if num <= arr[mid]: # 해당 값이 현재 위치보다 작거나 같다면, high를 현재 인덱스로 변경 
            high = mid
        else: # 그렇지 않다면, low를 현재 위치보다 1씩 크게 조절 
            low = mid + 1
    return high

def upper(arr, num): # upper bound : 해당 값보다 큰 값이 처음으로 나타나는 인덱스 반환
    low, high = 0, len(arr)
    while low < high:
        mid = (low+high)//2
        if num < arr[mid]: # 해당 값이 현재 위치보다 작거나 같다면, high를 현재 인덱스로 변경 
            high = mid
        else: # 그렇지 않다면, low를 현재 인덱스보다 1씩 크게 조절 
            low = mid + 1 
    return high

n = int(sys.stdin.readline())
arr = sorted(list(map(int, sys.stdin.readline().split())))
n = int(sys.stdin.readline()) # n을 사용하지 않아서 덮어써도 됨
find_arr = list(map(int, sys.stdin.readline().split())) # 배열에서 찾을 값들
for i in find_arr:
    print(upper(arr, i) - lower(arr, i), end=' ') # 값들의 개수는 upper bound - lower bound

 

2. dictionary를 사용한 풀이

dictionary에 해당 값과 값이 등장하는 수를 계산한 뒤 이를 반환하는 형식으로 문제 풀이를 진행했다.

import sys

ndic = {} # dictionary
n = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
for i in arr: # dicionary에 특정 값과 그 값의 등장 횟수 저장
    if i in ndic: # dictionary에 이미 존재하는 key면
        ndic[i] += 1 # 등장 개수 증가
    else: # dictionary에 존재하지 않는 key라면
        ndic[i] = 1 # 1 저장
n = int(sys.stdin.readline()) # n은 사용하지 않으므로 덮어써도 됨
arr = list(map(int, sys.stdin.readline().split())) # 이전 arr는 사용하지 않으므로 덮어써도 됨
for i in arr: # arr 순회하며
    if i in ndic: # dictionary에 존재하면
        print(ndic[i], end=' ') # 등장 횟수 반환
    else: # 없다면
        print(0, end=' ') # 0 반환

'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글

(Python) 백준 10845번 - 큐  (0) 2023.01.10
(Python) 백준 10828번 - 스택  (0) 2023.01.10
(Python) 백준 10773번 - 제로  (0) 2023.01.09
(Python) 백준 9012번 - 괄호  (0) 2023.01.05
(Python) 백준 4949번 - 균형잡힌 세상  (2) 2023.01.05
    '알고리즘/알고리즘 문제 풀이' 카테고리의 다른 글
    • (Python) 백준 10845번 - 큐
    • (Python) 백준 10828번 - 스택
    • (Python) 백준 10773번 - 제로
    • (Python) 백준 9012번 - 괄호
    용꿀
    용꿀

    티스토리툴바