Skip to content

Minjeong#180

Closed
Mingguriguri wants to merge 3 commits intomainfrom
minjeong
Closed

Minjeong#180
Mingguriguri wants to merge 3 commits intomainfrom
minjeong

Conversation

@Mingguriguri
Copy link
Collaborator

μ£Ό λͺ©ν‘œ 문제 수: 3개

ν‘Ό 문제


λ°±μ€€ #13163. λ‹‰λ„€μž„μ— κ°“ 뢙이기: λ¬Έμžμ—΄ / 브둠즈3

πŸš©ν”Œλ‘œμš° (선택)

μ½”λ“œλ₯Ό 풀이할 λ•Œ μ μ—ˆλ˜ ν”Œλ‘œμš°κ°€ μžˆλ‚˜μš”?

  • λ¬Έμžμ—΄μ„ 곡백을 κΈ°μ€€μœΌλ‘œ split ν•˜κΈ°
  • splitν•˜μ—¬ κ΅¬λΆ„λœ 것 쀑에 1λ²ˆμ§ΈλΆ€ν„° λ‹€μ‹œ λ¬Έμžμ—΄λ‘œ ν•©μΉœ ν›„ 맨 μ•žμ— god ν•©μΉ˜κΈ°

πŸš©μ œμΆœν•œ μ½”λ“œ

n = int(input())

for i in range(n):
    name = input().split()
    god = 'god' + ''.join(name[1:])
    print(god)

λ°±μ€€ #1755. μˆ«μžλ†€μ΄ : λ¬Έμžμ—΄ / 싀버4

πŸš©ν”Œλ‘œμš° (선택)

μ½”λ“œλ₯Ό 풀이할 λ•Œ μ μ—ˆλ˜ ν”Œλ‘œμš°κ°€ μžˆλ‚˜μš”?

  1. μ΄ˆκΈ°ν™” μž‘μ—…μ„ μ§„ν–‰ν•œλ‹€.
    1. 숫자λ₯Ό μ˜μ–΄λ‘œ λ³€ν™˜ν•˜κΈ° μœ„ν•œ 리슀트 englishλ₯Ό μ€€λΉ„ν•œλ‹€.
      이 λ¦¬μŠ€νŠΈλŠ” 숫자 0λΆ€ν„° 9κΉŒμ§€μ˜ μ˜λ‹¨μ–΄λ₯Ό μ €μž₯ν•œ λ¦¬μŠ€νŠΈμ΄λ‹€. 인덱슀둜 κ΅¬λΆ„ν•˜μ—¬ μ €μž₯ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 0번째 μΈλ±μŠ€μ—λŠ” zero, 1번째 μΈλ±μŠ€μ—λŠ” one, … 9번째 μΈλ±μŠ€μ—λŠ” nine으둜 english λ¦¬μŠ€νŠΈμ— μ €μž₯ν•œλ‹€.
    2. 이 문제λ₯Ό ν’€κΈ° μœ„ν•΄ 닡이 λ˜μ–΄ λ°˜ν™˜ν•  λ”•μ…”λ„ˆλ¦¬ answerλ₯Ό 빈 λ”•μ…”λ„ˆλ¦¬λ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.
    3. μ‹œμž‘ λ²”μœ„ mκ³Ό 끝 λ²”μœ„ n을 μž…λ ₯λ°›λŠ”λ‹€.
    4. mμ—μ„œ nκΉŒμ§€μ˜ 숫자 리슀트λ₯Ό nums에 μ €μž₯ν•œλ‹€.
  2. nums 리슀트λ₯Ό μˆœνšŒν•˜λ©° ν•΄λ‹Ή ν•˜λŠ” 값에 λͺ«κ³Ό λ‚˜λ¨Έμ§€λ₯Ό 각각 english 리슀트λ₯Ό μ‚¬μš©ν•˜ μ˜λ‹¨μ–΄λ‘œ λ³€ν™˜ν•˜μ—¬ temp에 μ €μž₯ν•œλ‹€.
  3. λ³€ν™˜λœ temp λ¬Έμžμ—΄μ„ answer λ”•μ…”λ„ˆλ¦¬μ— num을 ν‚€λ‘œ ν•˜μ—¬ μ €μž₯ν•œλ‹€.
  4. μ‚¬μ „μˆœμœΌλ‘œ μ •λ ¬ν•œ 후에 좜λ ₯ν•œλ‹€.
    1. answer λ”•μ…”λ„ˆλ¦¬μ˜ items()λ₯Ό valueλ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•˜μ—¬ 좜λ ₯ν•œλ‹€.
    2. cnt λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄ 좜λ ₯된 숫자의 개수λ₯Ό μ„Έκ³ , 10개λ₯Ό 좜λ ₯ν•  λ•Œλ§ˆλ‹€ μ€„λ°”κΏˆμ„ ν•œλ‹€.

πŸš©μ œμΆœν•œ μ½”λ“œ

import sys
input = sys.stdin.readline

# 숫자 0λΆ€ν„° 9κΉŒμ§€μ˜ μ˜μ–΄ ν‘œν˜„μ„ λ¦¬μŠ€νŠΈμ— μ €μž₯
english = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
answer = {} # κ²°κ³Όλ₯Ό μ €μž₯ν•  λ”•μ…”λ„ˆλ¦¬ (key: 숫자, value: μ˜μ–΄ ν‘œν˜„)

m, n = map(int, input().split())
nums = list(range(m, n+1)) # m ~ nκΉŒμ§€μ˜ 숫자 리슀트

# 숫자λ₯Ό μ˜μ–΄λ‘œ λ³€ν™˜ν•˜μ—¬ 사전에 μ €μž₯
for num in nums:
    temp = ""
    if num // 10 > 0:  # μ‹­μ˜ 자리 μˆ«μžκ°€ μ‘΄μž¬ν•˜λŠ” 경우
        temp += english[num // 10] + " "
    temp += english[num % 10]
    answer[num] = temp # λ”•μ…”λ„ˆλ¦¬μ— μΆ”κ°€
    
# μ‚¬μ „μˆœμœΌλ‘œ μ •λ ¬ ν›„ 10κ°œμ”© 좜λ ₯
cnt = 0
for key, value in sorted(answer.items(), key=lambda x:x[1]): # value 값을 κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬
    cnt += 1
    print(key, end=" ")
    if cnt == 10: # 10개 좜λ ₯ν•  λ•Œλ§ˆλ‹€ μ€„λ°”κΏˆ
        print()
        cnt = 0

πŸ’‘TIL

배운 점이 μžˆλ‹€λ©΄ μž…λ ₯ν•΄μ£Όμ„Έμš”

  • λ‚˜λŠ” 이 λ¬Έμ œμ— λŒ€ν•΄ 쓸데없이 μ’€ μž₯ν™©ν•˜κ²Œ ν’€κΈ΄ ν–ˆλ‹€..

  • 자꾸 자꾸 lambdaλ₯Ό μ΄μš©ν•˜μ—¬ μ •λ ¬ν•˜λŠ” 뢀뢄을 κΉŒλ¨ΉλŠ”λ‹€. κΌ­ κΈ°μ–΅ν•˜μž λ©”λͺ¨.

    >>> for key, value in sorted(pi.items(), key=lambda x:-x[1]):
    >>>     pi_list.append(key+":"+str(value))
    >>> pi_list
    # ['cc:9', 'bb:5', 'c:4', 'a:3', 'b:1', 'aa:1']

λ°±μ€€ #16173. 점프왕 쩰리 (Small) : DFSBFS / 싀버4

πŸš©ν”Œλ‘œμš° (선택)

μ½”λ“œλ₯Ό 풀이할 λ•Œ μ μ—ˆλ˜ ν”Œλ‘œμš°κ°€ μžˆλ‚˜μš”?

  1. κ²Œμž„ κ΅¬μ—­μ˜ 크기 n을 μž…λ ₯λ°›κ³  κ²Œμž„νŒμ˜ ꡬ역(λ§΅)을 jump_game λ¦¬μŠ€νŠΈμ— μ €μž₯ν•œλ‹€.
  2. BFS 탐색을 μ‹œμž‘ν•œλ‹€.
    1. 큐 queue에 μΆœλ°œμ μ„ μΆ”κ°€ν•œ ν›„, 였λ₯Έμͺ½κ³Ό μ•„λž˜ λ°©ν–₯으둜 ν˜„μž¬ μœ„μΉ˜μ˜ μΉΈ 수 만큼 μ΄λ™ν•œλ‹€.
    2. λ§΅ λ²”μœ„ μ•ˆμ— 있고, 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ€ κ²½μš°μ—λŠ”, λ°©λ¬Έ ν‘œμ‹œλ₯Ό ν•˜κ³  queue에 μΆ”κ°€ν•œλ‹€.
    3. 탐색 쀑에 도착점에 λ„λ‹¬ν–ˆλ‹€λ©΄, BFS 탐색을 μ’…λ£Œν•˜κ³  Trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
    4. 탐색할 queueκ°€ 더이상 μ—†λŠ” κ²½μš°μ—λŠ”, Falseλ₯Ό λ°˜ν™˜ν•œλ‹€.
  3. BFS 탐색 κ²°κ³Όκ°€ True 이면 β€œHaruHaru”λ₯Ό, False 이면 β€œHing”을 좜λ ₯ν•œλ‹€.

πŸš©μ œμΆœν•œ μ½”λ“œ

import sys
from collections import deque
input = sys.stdin.readline

def bfs(x, y, n):
    queue = deque()
    queue.append((x, y)) # μ‹œμž‘μ  μΆ”κ°€
    visited[x][y] = True # 초기 방문 처리

    while queue:
        x, y = queue.popleft()
        for dx, dy in [(0, jump_game[x][y]), (jump_game[x][y], 0)]: # μ•„λž˜ (0, jump), 였λ₯Έμͺ½ (jump, 0)
            nx, ny = x + dx, y + dy  # ν˜„μž¬ μœ„μΉ˜μ—μ„œ μΉΈ 수만큼 이동
            # λ§΅ λ²”μœ„ μ•ˆμ— 있고, 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 경우
            if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny]:
                if jump_game[nx][ny] == -1:  # 도착 지점에 λ„λ‹¬ν•˜λ©΄
                    return True
                visited[nx][ny] = True
                queue.append((nx, ny))  # λ‹€μŒ 이동 지점 μΆ”κ°€

    return False

# μž…λ ₯ 처리
n = int(input())
jump_game = []
visited = [[False for _ in range(n)] for _ in range(n)]
for _ in range(n):
    temp = list(map(int, input().split()))
    jump_game.append(temp)

# BFS 탐색
if bfs(0, 0, n):
    print("HaruHaru")
else:
    print("Hing")

πŸ’‘TIL

배운 점이 μžˆλ‹€λ©΄ μž…λ ₯ν•΄μ£Όμ„Έμš”

  • dx, dy 경둜 μ •μ˜μ— μ‹œκ°„μ„ 많이 μ†ŒλΉ„ν–ˆλ‹€. λ°©ν–₯을 κ²°μ •ν•˜λŠ” 쑰건을 λ¬Έμ œμ— 맞게 섀정을 ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€.
    • μ²˜μŒμ—λŠ” κΈ°μ‘΄ λ°©μ‹λŒ€λ‘œ dx, dyλ₯Ό μ •μ˜ν–ˆλŠ”λ°, 였λ₯Έμͺ½κ³Ό μ•„λž˜λ‘œλ§Œ 이동할 수 μžˆμœΌλ―€λ‘œ 1이 μ•„λ‹Œ ν˜„μž¬ μœ„μΉ˜μ˜ κ°’λ§ŒνΌ 이동해야 ν•œλ‹€λŠ” 점을 κΉ¨λ‹¬μ•˜λ‹€.
    • YμΆ• μ΄λ™μ—μ„œ μ•„λž˜λ‘œ 이동할 λ•Œ +λ₯Ό μ‚¬μš©ν•΄μ•Ό 함에도 λΆˆκ΅¬ν•˜κ³ , 잘λͺ»ν•΄μ„œ ``둜 μž‘μ„±ν•˜λŠ” μ‹€μˆ˜λ₯Ό ν–ˆλ‹€. μ’Œν‘œ 이동 λ°©ν–₯을 μ •ν™•νžˆ νŒŒμ•…ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.
    • dx, dy 섀정을 μ™Έμš°κΈ°λ³΄λ‹€λŠ” λ¬Έμ œμ— 맞게 μ‘μš©ν•˜λŠ” 것이 μ€‘μš”ν•¨μ„ λ°°μ› λ‹€.
  • 상단에 초기 λ°©λ¬Έ μ²˜λ¦¬ν•˜λŠ” 뢀뢄은 μžŠμ§€λ§μž
  • μ‚¬μ†Œν•˜μ§€λ§Œ νŒŒμ΄μ¬μ—μ„œ False인지 νŒλ‹¨ν•  λ•ŒλŠ” λ³€μˆ˜==False라고 μ“°λŠ” κ²ƒλ³΄λ‹€λŠ” not λ³€μˆ˜ μ΄λ ‡κ²Œ μ“°λŠ” 게 더 νŒŒμ΄μ¨λ‹‰ν•˜κ³  κΉ”λ”ν•œ 것 κ°™λ‹€.
  • νŒŒμ΄μ¬μ—μ„œ μ‘°κ±΄λ¬Έμ—μ„œ == False λŒ€μ‹  not을 μ‚¬μš©ν•˜λŠ” 것이 더 νŒŒμ΄μ¨λ‹‰ν•˜κ³  κΉ”λ”ν•˜λ‹€.

λ°±μ€€ #1072. κ²Œμž„: 이뢄탐색 / 싀버3

πŸš©ν”Œλ‘œμš° (선택)

μ½”λ“œλ₯Ό 풀이할 λ•Œ μ μ—ˆλ˜ ν”Œλ‘œμš°κ°€ μžˆλ‚˜μš”?

  1. 전체 κ²Œμž„ 수(x)와 이긴 κ²Œμž„ 수(y) μž…λ ₯ λ°›μ•„ ν˜„μž¬ 승λ₯  zλ₯Ό κ³„μ‚°ν•œλ‹€.
  2. μ΄λ•Œ zκ°€ 99이상이면 더이상 승λ₯ μ΄ λ³€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, -1을 좜λ ₯ν•˜κ³  ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•œλ‹€.
  3. 99 미만일 경우 이뢄탐색을 톡해 μ΅œμ†Œ κ²Œμž„ 수λ₯Ό μ°ΎλŠ”λ‹€.
    1. leftλŠ” 1, rightλŠ” x둜 μ„€μ •ν•˜κ³ , leftκ°€ right보닀 μž‘κ±°λ‚˜ 같은 λ™μ•ˆ 이뢄 탐색을 μ§„ν–‰ν•œλ‹€.
    2. leftλŠ” 1, rightλŠ” x둜 μ„€μ •ν•œλ‹€. left와 rightλ₯Ό κΈ°μ€€μœΌλ‘œ left값이 right값보닀 μž‘κ±°λ‚˜ 같을 κ²½μš°μ— λŒ€ν•΄ 이뢄 탐색을 μ§„ν–‰ν•œλ‹€.
    3. 쀑간값 midλ₯Ό λ‹€μ‹œ κ³„μ‚°ν•œ ν›„, μΆ”κ°€ κ²Œμž„μ„ ν–ˆμ„ λ•Œμ˜ μƒˆλ‘œμš΄ 승λ₯ μ„ κ³„μ‚°ν•œλ‹€.
    4. μΆ”κ°€ κ²Œμž„ ν›„μ˜ 승λ₯ μ΄ λ³€ν•˜μ§€ μ•ŠμœΌλ©΄, 더 λ§Žμ€ κ²Œμž„μ„ μΆ”κ°€ν•΄μ•Ό ν•˜λ―€λ‘œ leftλ₯Ό μ¦κ°€μ‹œν‚¨λ‹€.
    5. 승λ₯ μ΄ λ³€ν•œλ‹€λ©΄, ν•΄λ‹Ή mid 값을 μ •λ‹΅(answer)둜 μ„€μ •ν•˜κ³ , rightλ₯Ό 쀄여 더 적은 κ²Œμž„μœΌλ‘œ 승λ₯ μ΄ λ³€ν•  수 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
  4. 이뢄 탐색이 μ’…λ£Œλ˜λ©΄ μ΅œμ’…μ μœΌλ‘œ κ΅¬ν•œ μ΅œμ†Œ κ²Œμž„ 수인 answerλ₯Ό 좜λ ₯ν•œλ‹€.

πŸš©μ œμΆœν•œ μ½”λ“œ

import sys
input = sys.stdin.readline

x, y = map(int, input().split())  # 전체 κ²Œμž„ 수(x)와 이긴 κ²Œμž„ 수(y) μž…λ ₯
z = y // x * 100  # ν˜„μž¬ 승λ₯  z 계산

if z >= 99:  # λ§Œμ•½ 승λ₯ μ΄ 99% 이상이면 더 이상 승λ₯ μ„ λ³€ν™”μ‹œν‚¬ 수 μ—†μœΌλ―€λ‘œ -1 좜λ ₯ ν›„ μ’…λ£Œ
    print(-1)
    exit(0)

answer = 0
left = 1  # 이뢄 νƒμƒ‰μ˜ μ‹œμž‘κ°’ μ„€μ •
right = x  # 이뢄 νƒμƒ‰μ˜ 끝값 μ„€μ •

while left <= right:  # 이뢄 탐색 μ‹œμž‘
    mid = (left + right) // 2  # 쀑간 κ°’ 계산
    if ((y + mid) * 100) // (x + mid) <= z:  # μΆ”κ°€ν•œ κ²Œμž„ ν›„ 승λ₯  계산
        left = mid + 1  # 승λ₯ μ΄ λ³€ν•˜μ§€ μ•ŠμœΌλ©΄ 더 λ§Žμ€ κ²Œμž„μ„ μΆ”κ°€ν•΄μ•Ό ν•˜λ―€λ‘œ left 증가
    else:
        answer = mid  # 승λ₯ μ΄ λ³€ν•˜λ©΄ ν•΄λ‹Ή mid 값을 μ €μž₯ν•˜κ³ 
        right = mid - 1  # 더 적은 κ²Œμž„μ—μ„œ 승λ₯ μ΄ λ³€ν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ right κ°μ†Œ

print(answer)  # μ΅œμ’…μ μœΌλ‘œ κ΅¬ν•œ μ΅œμ†Œ κ²Œμž„ 수 좜λ ₯

πŸ’‘TIL

배운 점이 μžˆλ‹€λ©΄ μž…λ ₯ν•΄μ£Όμ„Έμš”

  • 이 문제λ₯Ό μ²˜μŒμ— 봀을 λ•ŒλŠ” μˆ˜ν•™μ μœΌλ‘œ μ ‘κ·Όν•΄μ•Ό ν•˜λŠ” 쀄 μ•Œμ•˜λ‹€. 근데 아무리봐도 μ–΄λ–€ κ·œμΉ™μœΌλ‘œ μ ‘κ·Όν•΄μ•Ό ν•  μ§€ 감이 μ˜€μ§€ μ•Šμ•˜λ‹€. 99ν΄λŸ½μ—μ„œ μ œκ³΅ν•˜λŠ” 힌트λ₯Ό λ³΄μ•˜λ”λ‹ˆ **이뢄탐색**이라고 λ‚˜μ™€μžˆμ—ˆλ‹€. 이 λ¬Έμ œκ°€ μ™œ 이뢄탐색인지 ν•œμ°Έμ„ κ³ λ―Όν–ˆλ˜ 것 κ°™λ‹€. 이 문제λ₯Ό κ³„κΈ°λ‘œ 이뢄탐색에 λŒ€ν•΄ λ³΅μŠ΅ν•  수 μžˆμ—ˆλ‹€.

    • **이뢄탐색**ν•  λ•ŒλŠ” left와 right의 λ²”μœ„λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 그리고 leftλ₯Ό μ–Έμ œ μ΄λ™μ‹œμΌœμ•Ό ν•˜λŠ”μ§€ rightλ₯Ό μ–Έμ œ μ‹œμΌœμ•Ό ν•˜λŠ”μ§€ κ·Έ 쑰건(=**탐색 λ²”μœ„λ₯Ό μ€„μ—¬κ°€λŠ” 쑰건)**도 ν•¨κ»˜ 생각해주어야 ν•œλ‹€.
  • Z에 λŒ€ν•΄ κ΅¬ν•˜κΈ° μœ„ν•΄μ„œ z = y // x * 100둜 ν’€μ—ˆλŠ”λ° ν‹€λ Έλ‹€κ³  λ‚˜μ™”λ‹€. 예제λ₯Ό λŒλ Έμ„ λ•ŒλŠ” 이상이 μ—†μ—ˆλŠ”λ° μ™œ μ•ˆ λ˜λŠ”μ§€ 이유λ₯Ό λͺ°λžλ‹€. κ²°κ΅­ λ‹€λ₯Έ λΆ„μ˜ 풀이λ₯Ό 보고 z = (y * 100) // x 둜 κ³ μ³€λ”λ‹ˆ ν•΄κ²°λ˜μ—ˆλ‹€. μ΄μœ λŠ” μ—°μ‚° μˆœμ„œμ— μžˆμ—ˆλ‹€.

    • y = 8이고, x = 10인 경우λ₯Ό 듀어보겠닀.
      1. z = y // x * 100
        • y // x = 8 // 10 = 0 (μ •μˆ˜ λ‚˜λˆ—μ…ˆμ΄κΈ° λ•Œλ¬Έμ— μ†Œμˆ˜μ  μ΄ν•˜λ₯Ό 버림)
        • 0 * 100 = 0
        • 결과적으둜 승λ₯ μ΄ 0으둜 잘λͺ» κ³„μ‚°λœλ‹€
      2. z = (y * 100) // x
        • λ¨Όμ € y * 100 = 8 * 100 = 800
        • κ·Έ λ‹€μŒ 800 // 10 = 80 (μ •μˆ˜ λ‚˜λˆ—μ…ˆμ΄λ―€λ‘œ μ†Œμˆ˜μ  μ΄ν•˜ 버림)
        • 결과적으둜 μ •ν™•ν•œ 승λ₯ μΈ 80이 κ³„μ‚°λœλ‹€.

    κΈ°μ‘΄ 방식은 λ¨Όμ € μ†Œμˆ˜μ μ„ 버렀버리기 λ•Œλ¬Έμ— 잘λͺ»λœ 계산이 λ‚˜μ˜¬ μˆ˜λ°–μ— μ—†μ—ˆλ˜ 것이닀. μ‹€μˆ˜μžλ£Œν˜•μ€ λ¬΄ν•œ μ†Œμˆ˜κ°€ λ‚˜μ˜¬ 수 μžˆλŠ”λ°, 컴퓨터 μ—°μ‚°μ˜ λ©”λͺ¨λ¦¬λŠ” 이λ₯Ό μ •ν™•νžˆ 컀버할 μˆ˜κ°€ μ—†μ–΄ μ˜ˆμƒκ³ΌλŠ” λ‹€λ₯Έ κ²°κ³Όκ°€ λ‚˜μ˜¬ 수 μžˆλ‹€. 이 뢀뢄에 λŒ€ν•΄ μƒˆλ‘œ μ•Œκ²Œ λ˜μ—ˆλ‹€.

    참고자료:


λ°±μ€€ #2252. 쀄 μ„Έμš°κΈ°: μœ„μƒμ •λ ¬,κ·Έλž˜ν”„ / κ³¨λ“œ3

πŸš©ν”Œλ‘œμš° (선택)

μ½”λ“œλ₯Ό 풀이할 λ•Œ μ μ—ˆλ˜ ν”Œλ‘œμš°κ°€ μžˆλ‚˜μš”?

  • μž…λ ₯ 처리
    • 학생 수 n, ν‚€ 비ꡐ 횟수 m을 μž…λ ₯λ°›λŠ”λ‹€.
    • 빈 κ·Έλž˜ν”„ graph와 λͺ¨λ“  ν•™μƒμ˜ μ§„μž…μ°¨μˆ˜λ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•œ indegree 리슀트λ₯Ό μƒμ„±ν•œλ‹€.
      • graph: 각 ν•™μƒμ˜ ν‚€ 비ꡐ 관계λ₯Ό μ €μž₯ (a번 학생이 b번 학생보닀 μ•žμ— μ„œμ•Ό ν•˜λ©΄, a -> b ν˜•νƒœλ‘œ μ—°κ²°).
      • indegree: 각 학생이 μ•žμ— μžˆμ–΄μ•Ό ν•˜λŠ” ν•™μƒλ“€μ˜ 수λ₯Ό μ €μž₯ (즉, μ§„μž… 차수).
  • κ°„μ„  정보 μž…λ ₯
    • m번 λ°˜λ³΅ν•˜μ—¬ a, b ν•™μƒμ˜ ν‚€ 비ꡐ 정보λ₯Ό μž…λ ₯λ°›λŠ”λ‹€.
    • aλŠ” b보닀 μ•žμ— μ„œμ•Ό ν•˜λ―€λ‘œ graph[a]에 bλ₯Ό μΆ”κ°€ν•˜κ³ , indegree[b]λ₯Ό 1 μ¦κ°€μ‹œν‚¨λ‹€.
  • μœ„μƒ μ •λ ¬ ν•¨μˆ˜ μ •μ˜ (topology_sort)
    • μ΅œμ’…μ μœΌλ‘œ 학생듀을 μ •λ ¬ν•œ μˆœμ„œλ₯Ό μ €μž₯ν•  리슀트 resultλ₯Ό μ„ μ–Έν•œλ‹€.
    • ν˜„μž¬ μ§„μž… μ°¨μˆ˜κ°€ 0인 학생듀을 λ‹΄λŠ” 큐qλ₯Ό deque μ‚¬μš©ν•΄ μ΄ˆκΈ°ν™”ν•œλ‹€.
  • 초기 큐 μ„€μ •
    • λͺ¨λ“  학생에 λŒ€ν•΄ indegree[i]κ°€ 0인 학생듀을 큐에 λ„£λŠ”λ‹€.
      • 즉, λ‹€λ₯Έ 학생보닀 μ•žμ— μ„œμ•Ό ν•  학생이 μ—†λŠ” 학생듀을 μ°ΎλŠ”λ‹€.
  • νμ—μ„œ 학생을 μ²˜λ¦¬ν•˜λ©° μœ„μƒ μ •λ ¬ μˆ˜ν–‰
    • 큐가 빌 λ•ŒκΉŒμ§€ λ‹€μŒμ„ λ°˜λ³΅ν•œλ‹€.
      • νμ—μ„œ μ§„μž… μ°¨μˆ˜κ°€ 0인 학생을 κΊΌλ‚΄κ³ , now에 μ €μž₯ν•˜κ³  이λ₯Ό κ²°κ³Ό λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•œλ‹€.
      • now 학생과 μ—°κ²°λœ λͺ¨λ“  ν•™μƒλ“€μ˜ μ§„μž… 차수λ₯Ό 1μ”© κ°μ†Œμ‹œν‚¨λ‹€.
      • μ§„μž… μ°¨μˆ˜κ°€ 0이 된 학생은 λ‹€μ‹œ 큐에 μ‚½μž…ν•œλ‹€.
      • 이 과정은 μ§„μž… μ°¨μˆ˜κ°€ 0이 λ˜λŠ” ν•™μƒλ“€λ§Œ 큐에 λ“€μ–΄κ°€λ―€λ‘œ, μˆœμ„œλŒ€λ‘œ μ •λ ¬λœλ‹€.
  • κ²°κ³Ό 좜λ ₯
    • λͺ¨λ“  학생을 μ²˜λ¦¬ν•œ ν›„, result λ¦¬μŠ€νŠΈμ— μ €μž₯된 학생듀을 좜λ ₯ν•œλ‹€.
    • μœ„μƒ 정렬에 μ˜ν•΄ μˆœμ„œκ°€ κ²°μ •λœ 학생듀이 좜λ ₯λœλ‹€.

πŸš©μ œμΆœν•œ μ½”λ“œ

import sys
from collections import deque
input = sys.stdin.readline

n, m = map(int, input().split()) # 학생 수, ν•™μƒμˆœμ„œ
graph = [[] for _ in range(n + 1)] # 학생 μˆœμ„œ κ·Έλž˜ν”„
table = [0] * (n+1) # μ§„μž…μ°¨μˆ˜ν‘œ

for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)
    table[b] += 1

# 큐둜 κ΅¬ν˜„
queue = deque()
for i in range(1, n+1):
    # μ§„μž…μ°¨μˆ˜ν‘œκ°€ 0인 경우 큐에 μ‚½μž…
    if table[i] == 0:
        queue.append(i)

# 큐가 빌 λ•ŒκΉŒμ§€ μ§„ν–‰
while queue:
    now = queue.popleft()
    for i in graph[now]:
        table[i] -= 1 # 1μ”© 제거
        # μ§„μž…μ°¨μˆ˜κ°€ 0인 값은 큐에 λ‹€μ‹œ μ‚½μž…
        if table[i] == 0:
            queue.append(i)
    print(now, end=" ")

πŸ’‘TIL

배운 점이 μžˆλ‹€λ©΄ μž…λ ₯ν•΄μ£Όμ„Έμš”
μœ„μƒμ •λ ¬μ΄ 마λƒ₯ μ–΄λ ΅κΈ°λ§Œ ν–ˆλŠ”λ° μ°¨κ·Όμ°¨κ·Ό μœ„μƒμ •λ ¬μ— λŒ€ν•΄ κ³΅λΆ€ν•œ ν›„ λ¬Έμ œμ— μ μš©ν•˜λ‹ˆκΉŒ μ’€ 이해가 λ˜μ—ˆλ‹€. μœ„μƒμ •λ ¬μ˜ 쑰건과 μœ„μƒμ •λ ¬λ§Œμ΄ κ°€μ§€κ³  μžˆλŠ” νŠΉμ§•μ„ μ΄ν•΄ν•˜κ²Œ λ˜μ—ˆλ‹€. μ•žμœΌλ‘œ 이 λ‚΄μš©μ„ ν† λŒ€λ‘œ λ‹¨κ³„λ³„λ‘œ 문제λ₯Ό ν’€μ–΄λ‚˜κ°€λ΄μ•Όκ² λ‹€.

@Mingguriguri Mingguriguri reopened this Apr 8, 2025
@Mingguriguri Mingguriguri deleted the minjeong branch May 19, 2025 13:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant