티스토리 뷰

Array1 - 문제풀이 위주


문1: 최빈수 구하기

# 1204. 최빈수 구하기

from collections import Counter

T = int(input())
for test_case in range(1, T + 1):
    n = int(input())

    counter_list = Counter(list(map(int, input().split())))
    max_v = max(counter_list.values())

    for k, v in counter_list.items():
        if v == max_v:
            print(f'#{test_case} {k}')
            break

풀이:

특정 자료에서 가장 여러 번 나타나는 값을 출력하는 코드이다. 주어진 특정 자료에서 각 원소의 발생 빈도를 확인하기 위하여 Collections 모듈의 Counter 을 사용하였다. 

 

# Counter 사용 법

from collections import Counter

print(Counter(["hi", "hey", "hi", "hi", "hello", "hey"]))

# result 
Counter({'hi': 3, 'hey': 2, 'hello': 1})

문2: View

# 1206. View

T = 10
for test_case in range(1, T + 1):
    n = int(input())
    buildings = list(map(int, input().split()))
    answer = 0

    for i in range(2, len(buildings)):
        stand = buildings[i]
        right = [buildings[i-1], buildings[i-2]]
        left = []
        if i+2 < len(buildings):
            left.append(buildings[i+2])
        if i+1 < len(buildings):
            left.append(buildings[i+1])

        # 검사 오른쪽
        check = True
        if right:
            temp1 = []
            temp1.extend(right)
            temp1.append(stand)
            if max(temp1) != stand:
                continue
        if left:
            temp2 = []
            temp2.extend(left)
            temp2.append(stand)
            if max(temp2) != stand:
                continue
        max_left = 0 if len(left)==0 else max(left)
        max_right = 0 if len(right)==0 else max(right)

        answer += min(stand-max_left, stand-max_right)

    print(f'#{test_case} {answer}')

풀이:

왼쪽과 오른쪽으로 창문을 열었을 때, 양쪽 모두 거리 2 이상의 공간이 확보될 때 조망권이 확보될 경우 조망권이 확보된 세대의 수를 반환하는 코드이다. 구현문제이기 때문에 풀이가 다양하고 더 나은 풀이가 있을 거라고 생각하지만 우선 나의 접근 방식은 다음과 같다. 

 

 ✔ 양 옆 두개 씩 살펴 보기
: left, right 리스트에 양 옆 두 개의 값들을 삽입한다. 

1) left, right 리스트 둘 다에서 stand 값이  max value 여야 한다. (stand 는 기준 빌딩)

2) stand 값이 max value 인 경우, left, right 리스트 각각에서 stand 값을 제외 한 두 번째 max value 값을 구하여 stand 값에서 뺀다.
3) 둘 중에 작은 값이 조망 권 확보한 세대 이다.

 


문3: Flatten

T = 10
for test_case in range(1, T + 1):
    dump = int(input())
    arr = list(map(int, input().split()))

    for _ in range(dump):
        max_idx = arr.index(max(arr))
        min_idx = arr.index(min(arr))

        arr[max_idx] -= 1
        arr[min_idx] += 1

    print(f'#{test_case} {max(arr)-min(arr)}')

 

풀이:

높은 곳의 상자를 낮은 곳에 옮기는 방식으로 최고점과 최저점의 간격을 줄이는 작업을 평탄화라 한다. 평탄화 작업 횟수 만큼 수행한 후 최고점과 최저점의 차이를 출력하는 코드이다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함