백준 17299번 : 오등큰수 (python)

2021. 11. 19. 12:23·Algorithm

문제

크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오등큰수 NGF(i)를 구하려고 한다.

Ai가 수열 A에서 등장한 횟수를 F(Ai)라고 했을 때, Ai의 오등큰수는 오른쪽에 있으면서 수열 A에서 등장한 횟수가 F(Ai)보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오등큰수는 -1이다.

예를 들어, A = [1, 1, 2, 3, 4, 2, 1]인 경우 F(1) = 3, F(2) = 2, F(3) = 1, F(4) = 1이다. A1의 오른쪽에 있으면서 등장한 횟수가 3보다 큰 수는 없기 때문에, NGF(1) = -1이다. A3의 경우에는 A7이 오른쪽에 있으면서 F(A3=2) < F(A7=1) 이기 때문에, NGF(3) = 1이다. NGF(4) = 2, NGF(5) = 2, NGF(6) = 1 이다.

입력

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.

출력

총 N개의 수 NGF(1), NGF(2), ..., NGF(N)을 공백으로 구분해 출력한다.

예제 입력 1 복사

7
1 1 2 3 4 2 1

예제 출력 1 복사

-1 -1 1 2 2 1 -1

코드

# 1. 입력받은 숫자들을 각 숫자마다 리스트안에 몇번씩 들어있는지 
# 딕셔너리를 이용하여 세어준다.
# 2. 입력받은 값들의 인덱스에 맞춰 각 원소가 들어있는 개수들로 이루어진 리스트 생성(num_add)
# 3. stack안에 인덱스를 넣어준다.
# - 이때 기존에 stack을 통해 num_add에 들어있던 값들과 비교하며 만약 기족에 들어있던것보다
# 값이 크다면 기존의 들어있던 값을 result리스트에 넣어주고 stack에서 
# 해당 인덱스를 pop하여주고, 밑에 있는 인덱스를 통해 다시 비교하여준다..
# - 만약 값이 작다면 stack에 해당 값의 인덱스를 그대로 넣어준다.
# 4. 3번을 마지막 원소까지 반복하여준다.

n=int(input())
num=list(map(int,input().split()))
num_add=[]
stack=[]
result=[-1]*n
dic={}
for i in num:
    # 각 원소가 들어있는 개수를 딕셔너리를 통해 만들어준다.
    if(dic.get(i) !=None):
        dic[i]+=1
    else:
        dic[i]=1
for i in num:
    # 입력받은 값들의 인덱스에 맞춰 각 원소가 들어있는 개수들로 이루어진 리스트 생성
    num_add.append(dic.get(i))
for i in range(len(num_add)):
    while(len(stack)!=0 and num_add[stack[-1]]<num_add[i]):
        # stack에 저장최어 있는 인덱스를 통해 num_add(몇번 들어있는지가 들어있는 리스트)
        # 의 값을 비교 후 만약 전의 값보다 크면 result에 넣어주고 pop
        # 전의값보다 작으면 그대로 index를 stack에 넣어줌
        result[stack[-1]]=num[i]
        stack.pop()
        
    stack.append(i)
print(*result)

 

느낀점

인덱스를 스택(리스트)에 넣어 사용하는 방식도 있음
차례대로 하나씩 비교할때는 스택을 사용하는 방식을 고려해보기
중복되는 값이 많고 찾아비교할때는 딕셔너리를 사용하자

728x90

'Algorithm' 카테고리의 다른 글

백준 1935번 : 후위표기식2 (python)  (0) 2021.11.21
백준 17298번 : 오큰수(python)  (0) 2021.11.20
백준 10799번 : 쇠막대기  (0) 2021.11.18
백준 17413번 : 단어 뒤집기2(python)  (0) 2021.11.17
백준 1874번 : 스택수열(python)  (0) 2021.11.08
'Algorithm' 카테고리의 다른 글
  • 백준 1935번 : 후위표기식2 (python)
  • 백준 17298번 : 오큰수(python)
  • 백준 10799번 : 쇠막대기
  • 백준 17413번 : 단어 뒤집기2(python)
study ticket
study ticket
  • study ticket
    혼자하는 공부
    study ticket
  • 전체
    오늘
    어제
    • 개발 (77)
      • 오류 (1)
      • Spring (13)
      • Java (0)
      • Data structure (6)
      • Algorithm (49)
        • 백준 (17)
        • 프로그래머스 (2)
      • 문제풀면서 알게되는것들 끄적 (2)
      • 머신러닝 (4)
        • sklearn (3)
        • pandas (1)
      • 프로젝트 (0)
        • 핏두 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준1157
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
study ticket
백준 17299번 : 오등큰수 (python)
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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