728x90
λ°˜μ‘ν˜•

λ¬Έμ œπŸ˜‚

μ˜€λŠ˜λ„ μ„œμ€€μ΄λŠ” λ„ˆλΉ„ μš°μ„  탐색(BFS) μˆ˜μ—… 쑰ꡐλ₯Ό ν•˜κ³  μžˆλ‹€. μ•„λΉ κ°€ μˆ˜μ—…ν•œ λ‚΄μš©μ„ 학생듀이 잘 μ΄ν•΄ν–ˆλŠ”μ§€ 문제λ₯Ό ν†΅ν•΄μ„œ ν™•μΈν•΄λ³΄μž.

N개의 정점과 M개의 κ°„μ„ μœΌλ‘œ κ΅¬μ„±λœ 무방ν–₯ κ·Έλž˜ν”„(undirected graph)κ°€ 주어진닀. 정점 λ²ˆν˜ΈλŠ” 1λ²ˆλΆ€ν„° N번이고 λͺ¨λ“  κ°„μ„ μ˜ κ°€μ€‘μΉ˜λŠ” 1이닀. 정점 Rμ—μ„œ μ‹œμž‘ν•˜μ—¬ λ„ˆλΉ„ μš°μ„  νƒμƒ‰μœΌλ‘œ λ…Έλ“œλ₯Ό λ°©λ¬Έν•  경우 λ…Έλ“œμ˜ λ°©λ¬Έ μˆœμ„œλ₯Ό 좜λ ₯ν•˜μž.

λ„ˆλΉ„ μš°μ„  탐색 μ˜μ‚¬ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€. μΈμ ‘ 정점은 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ°©λ¬Έν•œλ‹€.

bfs(V, E, R) {  # V : 정점 집합, E : κ°„μ„  집합, R : μ‹œμž‘ 정점
    for each v ∈ V - {R}
        visited[v] <- NO;
    visited[R] <- YES;  # μ‹œμž‘ 정점 R을 λ°©λ¬Έ ν–ˆλ‹€κ³  ν‘œμ‹œν•œλ‹€.
    enqueue(Q, R);  # 큐 맨 뒀에 μ‹œμž‘ 정점 R을 μΆ”κ°€ν•œλ‹€.
    while (Q ≠ ∅) {
        u <- dequeue(Q);  # 큐 맨 μ•žμͺ½μ˜ μš”μ†Œλ₯Ό μ‚­μ œν•œλ‹€.
        for each v ∈ E(u)  # E(u) : 정점 u의 인접 정점 집합.(정점 번호λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ°©λ¬Έν•œλ‹€)
            if (visited[v] = NO) then {
                visited[v] <- YES;  # 정점 vλ₯Ό λ°©λ¬Έ ν–ˆλ‹€κ³  ν‘œμ‹œν•œλ‹€.
                enqueue(Q, v);  # 큐 맨 뒀에 정점 vλ₯Ό μΆ”κ°€ν•œλ‹€.
            }
    }
}

μž…λ ₯

첫째 쀄에 μ •μ μ˜ 수 N (5 ≤ N ≤ 100,000), κ°„μ„ μ˜ 수 M (1 ≤ M ≤ 200,000), μ‹œμž‘ 정점 R (1 ≤ R ≤ N)이 μ£Όμ–΄μ§„λ‹€.

λ‹€μŒ M개 쀄에 κ°„μ„  정보 u vκ°€ 주어지며 정점 u와 정점 v의 κ°€μ€‘μΉ˜ 1인 μ–‘λ°©ν–₯ 간선을 λ‚˜νƒ€λ‚Έλ‹€. (1 ≤ u < v ≤ N, u  v) λͺ¨λ“  κ°„μ„ μ˜ (u, v) 쌍의 값은 μ„œλ‘œ λ‹€λ₯΄λ‹€.

좜λ ₯

첫째 쀄뢀터 N개의 μ€„에 μ •μˆ˜λ₯Ό ν•œ κ°œμ”© 좜λ ₯ν•œλ‹€. i번째 μ€„μ—λŠ” 정점 i의 λ°©λ¬Έ μˆœμ„œλ₯Ό 좜λ ₯ν•œλ‹€. μ‹œμž‘ μ •μ μ˜ λ°©λ¬Έ μˆœμ„œλŠ” 1이닀. μ‹œμž‘ μ •μ μ—μ„œ λ°©λ¬Έν•  수 μ—†λŠ” 경우 0을 좜λ ₯ν•œλ‹€.

 

λ‚΄ ν’€πŸ¦·

# 24444. μ•Œκ³ λ¦¬μ¦˜ μˆ˜μ—… - λ„ˆλΉ„ μš°μ„  탐색1
from collections import deque # μš”κ±° μ•ˆν•˜κ³  κ·Έλƒ₯ stack으둜 ν•˜λ©΄ μ—λŸ¬ λ‚˜μš”...
import sys  
input = sys.stdin.readline

def bfs(R, V): # V: 정점 개수, E κ°„μ„ , R : μ‹œμž‘ 정점
    global visited
    visited = [0] * (V+1)
    q = deque([R])   # deque = deque() => λΉ„μ–΄μžˆλŠ” 큐 λ§Œλ“€κΈ°
    visited[R] = 1
    order = 1   # λͺ‡λ²ˆμ§ΈμΈμ§€ μ•ŒκΈ°μœ„ν•΄μ„œ μˆœμ„œλ₯Ό 1둜 μ΄ˆκΈ°ν™”ν•΄μ£Όκ³ 
    while q:
        t = q.popleft() # pop(0)
        # num[t].sort()
        for i in num[t]:
            # for i in sorted(num[t]): #sortedλ₯Ό μ“ΈκΊΌλ©΄ μ΄λ ‡κ²Œ!!!
            if visited[i] == 0:
                q.append(i)
                order += 1 # μ°Ύμ„λ–„λ§ˆλ‹€ μˆœμ„œλ₯Ό 1μ”© 더해쀀닀
                visited[i] = order


N, M, R = map(int, input().split())
num = [[] for _ in range(N+1)]

for _ in range(M):
    v1, v2 = map(int, input().split())
    num[v1].append(v2)
    num[v2].append(v1)

for k in num:
    k.sort()

bfs(R, N)

for s in visited[1::]:
    print(s)

 

문제 ν’€λ©΄μ„œ μ–΄λ €μ› λ˜ 점...

 

1. μ‹œκ°„μ΄ˆκ³Ό => import collections import deque와 import sys둜 ν•΄κ²°!!

 

- deque와 stackκ³Ό λ‹€λ₯Έ 점듀... 

  • deque = deque() => λΉ„μ–΄ μžˆλŠ” 큐 λ§Œλ“€μ–΄μ£ΌκΈ°  (stack은 q = [])
  • popleft() => 제일 첫 κ°’ λΉΌμ£ΌκΈ° (stack은 pop(0))

 

2. μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 뽑아 μž…λ ₯받은것듀을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ (λ‚˜λŠ” μž…λ ₯ 받은 순 κ³ λŒ€λ‘œ λ§Œλ“€μ–΄μ„œ 계속 정닡이 μ•ˆ λ‚˜μ™”λ‹€...)

  • num[t].sort()
  • for i in sorted(num[t])
  • for k in num: k.sort() .... λ“±λ“± μ—¬λŸ¬ 방법이 μžˆλ‹€(이차원 배열이라 μ‰½μ§€μ•ŠμŒ..)

 

μ°Έκ³ ν•˜λ©΄ 쒋을 κ°œλ…λ“€ ✍️

1) BFS(λ„ˆλΉ„μš°μ„ νƒμƒ‰)

κ·Έλž˜ν”„μ™€ 트리의 κ°€κΉŒμš΄ λ…Έλ“œλΆ€ν„° νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜.. 큐의 자료ꡬ쑰λ₯Ό 이용

 

- λ™μž‘κ³Όμ •

  • 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό 큐에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ 처리
  • νμ—μ„œ λ…Έλ“œλ₯Ό κΊΌλ‚΄ ν•΄λ‹Ή λ…Έλ“œμ˜ 인접 λ…Έλ“œ 쀑 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 곳을 큐에 μ‚½μž…ν•˜κ³  방문처리
  • 큐가 μ—†μ–΄μ§ˆ λ•ŒκΉŒμ§€ 반볡!!
def bfs(s, V): # μ‹œμž‘ 정점 s, λ§ˆμ§€λ§‰ 정점 V
    # visited 생성 => 이 μˆœμ„œ κΈ°μ–΅ν•˜κΈ°!!!!!
    visited = [0] * (V + 1)
    # 큐생성
    q = []  # 이 타이밍에 q = [s] 해도 λ©λ‹ˆλ‹Ή
    # μ‹œμž‘μ  인큐
    q.append(s)
    # μ‹œμž‘μ  λ°©λ¬Έ ν‘œμ‹œ
    visited[s] = 1
    while q: # 큐에 정점이 λ‚¨μ•„μžˆμœΌλ©΄ 계속 진행... (front != rear 라고도 μ‚¬μš©κ°€λŠ₯!! κ°™μœΌλ©΄ λΉˆκ±°λ‹ˆκΉŒ
        t = q.pop(0) # 디큐, μ•žμ—μ„œ λ½‘μ•„μ•Όκ²Ÿμ₯¬
        print(t)    # λ°©λ¬Έν•œ μ •μ μ—μ„œ 할일
        # μΈμ ‘ν•œ 정점 쀑 μΈνλ˜μ§€ μ•Šμ€ 정점 wκ°€ 있으면
        for w in adj_l[t]:
            if visited[w] == 0:
                # wλ₯Ό 인큐, 인큐 λ˜μ—ˆμŒμ„ ν‘œμ‹œ
                q.append(w)
                # visited[w] = 1
                visited[w] = visited[t] + 1 #### μ΅œμ†Œκ±°λ¦¬λ₯Ό ꡬ할 λ•Œ μ’‹μ•„μš© ###
    # print(visited[1:])

 

저희 μ‹œν—˜μ΄ importλ₯Ό μ‚¬μš©ν•  수 κ°€ 없어가지ꡬ...

문제 ν’€λ•Œ dequeλ₯Ό 쓰지 μ•Šμ•„ μƒμ†Œν•œλ°μš”... 데크 μ“°λŠ” 법은 πŸ‘‡πŸ‘‡

 

from collections import deque

def bfs(start):
    global graph, visited
    
    queue = deque([start]) # μ‹œμž‘μ μ„ 큐에 λ„£μ–΄μ€λ‹ˆλ‹€
    visited[start] = True  # λ°©λ¬Έ ν‘œμ‹œλ₯Ό ν•΄μ€λ‹ˆλ‹€
    
    while queue: # 큐에 λ‚¨μ•„μžˆλŠ” 값이 없을 λ–„κΉŒμ§€ 반볡!!
        v = queue.popleft() # 큐의 첫번째 값을 λΉΌμ˜΅λ‹ˆλ‹€
        print(v, end = '') # μ–΄λ–€ 경둜둜 λ°©λ¬Έν–ˆλŠ”μ§€ μ μ–΄μ€λ‹ˆλ‹€
        
        for i in graph[v]:  # v에 μΈμ ‘ν•œ 곳을 λŒλ©΄μ„œ
            if not visited[i]: # λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄
                queue.append(i) # 큐에 λ„£μ–΄μ£Όκ³ 
                visited[i] = True # λ°©λ¬Έ ν‘œμ‹œλ₯Ό ν•΄μ€λ‹ˆλ‹€

bfs(1) # 1은 κ·Έλƒ₯ μ‹œμž‘μ  예λ₯Ό 1둜 λ“ κ±°..
728x90
λ°˜μ‘ν˜•

728x90
λ°˜μ‘ν˜•

λ¬Έμ œπŸ˜‚

NxN 크기의 λ―Έλ‘œμ—μ„œ μΆœλ°œμ§€μ—μ„œ λͺ©μ μ§€μ— λ„μ°©ν•˜λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 4

도착할 수 있으면 1, μ•„λ‹ˆλ©΄ 0을 좜λ ₯ν•œλ‹€.

주어진 미둜 λ°–μœΌλ‘œλŠ” λ‚˜κ°ˆ 수 μ—†λ‹€.

 

λ‹€μŒμ€ 5x5 미둜의 μ˜ˆμ΄λ‹€.
 

13101

10101

10101

10101

10021

 

λ§ˆμ§€λ§‰ μ€„μ˜ 2μ—μ„œ μΆœλ°œν•΄μ„œ 0인 ν†΅λ‘œλ₯Ό 따라 μ΄λ™ν•˜λ©΄ 맨 μœ—μ€„μ˜ 3에 도착할 수 μžˆλŠ”μ§€ ν™•μΈν•˜λ©΄ λœλ‹€.

 
 

[μž…λ ₯]
 

첫 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 개수 Tκ°€ 주어진닀.  1<=T<=50
 

λ‹€μŒ 쀄뢀터 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ λ³„λ‘œ 미둜의 크기 Nκ³Ό N개의 쀄에 걸쳐 미둜의 ν†΅λ‘œμ™€ 벽에 λŒ€ν•œ 정보가 주어진닀. 0은 ν†΅λ‘œ, 1은 λ²½, 2λŠ” 좜발, 3은 도착이닀. 5<=N<=100

 

[좜λ ₯]
 

각 μ€„λ§ˆλ‹€ "#T" (TλŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 번호)λ₯Ό 좜λ ₯ν•œ λ’€, κ³„μ‚°κ²°κ³Όλ₯Ό μ •μˆ˜λ‘œ 좜λ ₯ν•˜κ±°λ‚˜ λ˜λŠ” ‘error’λ₯Ό 좜λ ₯ν•œλ‹€.

 

λ‚΄ ν’€πŸ¦·

# 4875. 미둜
# μΆœλ°œμ§€μ—μ„œ λͺ©μ μ§€μ— λ„μ°©ν•˜λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ 확인

# 사방 탐색
dx = [0, 1, 0, -1] # λ²”μœ„ μ œλŒ€λ‘œ 확인
dy = [-1, 0, 1, 0]
def miro(i, j):
    global result # κ²°κ³Όκ°’ μ „μ—­λ³€μˆ˜λ‘œ μ„€μ •ν•΄μ£ΌκΈ°
    visited[i][j] = True # λ°©λ¬Έν•œ κ³³ true둜 λ°”κΏ”μ£ΌκΈ°
    for k in range(4): # 사방탐색 진행
        di = i + dx[k]
        dj = j + dy[k] # ν•˜λ‚˜ν•˜λ‚˜ μ‹ κ²½μ¨μ„œ 적기
        if 0 <= di < N and 0 <= dj < N and not visited[di][dj]:

            # 0이라 갈수 μžˆλŠ”λ° 아직 방문을 μ•ˆν–ˆλ‹€λ©΄ μƒˆλ‘­κ²Œ κ·Έ 지점을 λ‹€μ‹œ λ°©λ¬Έν•΄μ•Ό ν•˜λ‹ˆκΉŒ μž¬κ·€
            if arr[di][dj] == 0:
                miro(di, dj) # μž¬κ·€λž„^^;;;;;

            # 3 λ„μ°©ν•˜λ©΄ 성곡
            elif arr[di][dj] == 3:
                result = 1 # κ²°κ³Όκ°’ μ„±κ³΅μœΌλ‘œ λ°”κΎΈκΈ°
                break


T = int(input())
for tc in range(1, T + 1):
    N = int(input()) # 미둜의 크기
    arr = [list(map(int, input().strip())) for _ in range(N)]
    # λ°©λ¬Έ 검사
    visited = [[False for _ in range(N)] for _ in range(N)]
    result = 0 # κ²°κ³Όκ°’ (일단 μ‹€νŒ¨)

    for i in range(N-1, -1, -1):
        for j in range(N-1, -1, -1):
            if arr[i][j] == 2:
                miro(i, j) # ν•¨μˆ˜μ— μ‹œμž‘μ  λ„£μ–΄μ£ΌκΈ°

    print(f'#{tc} {result}')

 

λ‚΄κ°€ 잘 λͺ» ν’€μ—ˆλ˜ 점...

 

1. 사방 탐색 λ²”μœ„ 확인!!! : 잘λͺ» μ μ—ˆλ“œλž˜μš”.. κΌ­ ν™•μΈν•˜κ³  적기;;;

2. Runtime error : strip()을 μ‚¬μš©ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€κ³  κ·ΈλŸ¬λŠ”λ°...

    우리 λˆˆμ—λŠ” μ•ˆ λ³΄μ΄μ§€λ§Œ \n 이 포함 λ˜μ–΄ μžˆμ„μ§€λ„ λͺ¨λ₯Έλ‹€κ³ ν•˜λ„€μš”....

    그리고 input()은 μ•Œμ•„μ„œ 곡백을 μ œκ±°ν•΄μ£Όμ§€λ§Œ

    sysλ₯Ό μ‚¬μš©ν•  λ–„λŠ” 그런 κΈ°λŠ₯이 μ—†μ–΄μ„œsys.stdin.readline().strip() 같이 무쑰건 μ¨μ€˜μ•Ό ν•œλ°μš”!! 😡‍πŸ’«

 

참고함면 쒋을 κ°œλ…λ“€ ✍️

 

1) 탐색

: λ§Žμ€ μ–‘μ˜ 데이터 μ€‘μ—μ„œ μ›ν•˜λŠ” 데이터λ₯Ό μ°ΎλŠ” κ³Όμ •

 ex) DFS, BFS

 

 

2) DFS(깊이 μš°μ„  탐색)

  • μŠ€νƒ μžλ£Œκ΅¬μ‘°μ— κΈ°μ΄ˆν•œλ‹€..
  • μ‹€μž¬λ‘œλŠ” μŠ€νƒλ³΄λ‹€λŠ” μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ κ°„κ²°ν•˜κ²Œ(?) κ΅¬ν˜„ν•  수 μžˆλ‹€
  • μ‹œκ°„ λ³΅μž‘λ„ : O(N)
# dfs & μž¬κ·€ ν•¨μˆ˜
def dfs(v): # v : μ‹œμž‘μ 
    global visited, graphs  # ν•¨μˆ˜ μ•ˆμ—μ„œ λ§Œλ“€μ–΄μ€€κ²Œ μ•„λ‹ˆλΌ μ•ˆμ •μ„±μ„ μœ„ν•΄ μ „μ—­λ³€μˆ˜λ‘œ μ„€μ •ν•΄μ£Όμ—ˆλ‹€
    visited[v] = True
    
    for i in graphs[v]: # 인접해 μžˆλŠ” κ³³ 쀑에 
        if not visited[i]: # 방문을 μ•ˆν–ˆλ‹€λ©΄
            dfs(i)  # κ·Έ 곳을 탐색!!
        
        else:
            continue # 이미 λ°©λ¬Έν•œ κ³³ 패슀 # 이 λΆ€λΆ„ μ•ˆ μ μ–΄μ€˜λ„ λœλ‹€
            
graph = [] # κ·Έλž˜ν”„λ₯Ό ν‘œν˜„ν•˜λŠ” 인접 리슀트(인접 ν–‰λ ¬ 어렀움 γ…œγ…œ)
visited = [] # 각 λ…Έλ“œκ°€ 방문된 정보λ₯Ό ν‘œν˜„ν•˜λŠ” 1 차원 리슀트(true, flase/ 0,1둜 ꡬ문)

dfs(0)

 

 => κ²½λ‘œκ°€ μžˆλŠ”μ§€ 확인할 λ–„λŠ” dfs λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 μ’‹λ‹€κ³  ν•˜λ„€μš”..

728x90
λ°˜μ‘ν˜•
728x90
λ°˜μ‘ν˜•

문제 πŸ˜‚

ForthλΌλŠ” 컴퓨터 μ–Έμ–΄λŠ” μŠ€νƒ 연산을 기반으둜 ν•˜κ³  μžˆμ–΄ ν›„μœ„ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 3+4λŠ” λ‹€μŒκ³Ό 같이 ν‘œκΈ°ν•œλ‹€.
 

3 4 + .
 

Forthμ—μ„œλŠ” λ™μž‘μ€ λ‹€μŒκ³Ό κ°™λ‹€.
 

μˆ«μžλŠ” μŠ€νƒμ— λ„£λŠ”λ‹€.

μ—°μ‚°μžλ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒμ˜ 숫자 두 개λ₯Ό κΊΌλ‚΄ λ”ν•˜κ³  κ²°κ³Όλ₯Ό λ‹€μ‹œ μŠ€νƒμ— λ„£λŠ”λ‹€.

‘.’은 μŠ€νƒμ—μ„œ 숫자λ₯Ό κΊΌλ‚΄ 좜λ ₯ν•œλ‹€.

 

Forth μ½”λ“œμ˜ μ—°μ‚° κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“œμ‹œμ˜€. λ§Œμ•½ ν˜•μ‹μ΄ 잘λͺ»λ˜μ–΄ 연산이 λΆˆκ°€λŠ₯ν•œ 경우 ‘error’λ₯Ό 좜λ ₯ν•œλ‹€.
 

λ‹€μŒμ€ Forth μ—°μ‚°μ˜ μ˜ˆμ΄λ‹€.
 

μ½”λ“œ 좜λ ₯
4 2 / . 2
4 3 - . 1

 

 

[μž…λ ₯]
 

첫 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 개수 Tκ°€ 주어진닀.  1T50
 

λ‹€μŒ 쀄뢀터 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ λ³„λ‘œ μ •μˆ˜μ™€ μ—°μ‚°μžκ°€ 256자 μ΄λ‚΄μ˜ μ—°μ‚°μ½”λ“œκ°€ 주어진닀. ν”Όμ—°μ‚°μžμ™€ μ—°μ‚°μžλŠ” μ—¬λ°±μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ 있으며, μ½”λ“œλŠ” ‘.’둜 λλ‚œλ‹€.

λ‚˜λˆ—μ…ˆμ˜ 경우 항상 λ‚˜λˆ„μ–΄ 떨어진닀.

 

[좜λ ₯]
 

#κ³Ό 1λ²ˆλΆ€ν„°μΈ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 번호, λΉˆμΉΈμ— 이어 계산결과λ₯Ό μ •μˆ˜λ‘œ 좜λ ₯ν•˜κ±°λ‚˜ λ˜λŠ” ‘error’λ₯Ό 좜λ ₯ν•œλ‹€.

 

λ‚΄ ν’€πŸ¦·

# 4874. Forth

# μž…λ ₯λ°›κΈ°
T = int(input())
for tc in range(1, T + 1):
    # μ—¬κΈ°μ„œ 문자둜 λ°›μ•„μ„œ λ‚˜μ€‘μ— 숫자둜 λ”°λ‘œ λ°”κΏ”μ€˜μ•Ό 함
    susik = input().split()
    # λ§ˆμ§€λ§‰μ— 점이 μžˆμ–΄μ„œ 미리 μ§€μ›Œμ€Œ
    susik.pop()
    # 연산을 담아쀄 리슀트 λ§Œλ“€κΈ°
    num = []
    # κ²°κ³Όκ°’ 1둜 μ΄ˆκΈ°ν™”, 0이면 μ—λŸ¬λ‘œ 좜λ ₯, 1이면 리슀트의 λ§ˆμ§€λ§‰ κ°’ 좜λ ₯
    result = 1

    # μˆ˜μ‹μ„ λ„λŠ” λ™μ•ˆ
    for i in range(len(susik)):
        # μˆ˜μ‹μ΄ ν”Όμ—°μ‚°μžλ©΄
        if susik[i] not in ['+','-','*','/']:
            # μˆ˜μ‹μ— κ·Έ 숫자λ₯Ό μ •μˆ˜λ‘œ λ°”κΏ”μ„œ λ„£μ–΄μ€€λ‹€
            num.append(int(susik[i]))

        # μˆ˜μ‹μ΄ μ—°μ‚°μžλ©΄
        else:
            # μˆ«μžκ°€ λ‘κ°œ 이상 λ‚¨μ•„μžˆμ–΄μ•Ό μ—°μ‚°μžλ₯Ό μ²˜λ¦¬ν•΄ μ£ΌλŠ”λ° μ•„λ‹ˆλ©΄
            # λ§žλŠ” μˆ˜μ‹μ΄ μ•„λ‹ˆλ‹ˆκΉŒ ν‹€λ ΈμœΌλ―€λ‘œ 결과값을 0으둜 λ°”κΏ”μ€€λ‹€
            if len(num) < 2:
                result = 0
                break

            else: # 리슀트의 길이가 2 이상이면 λ§žλŠ” μˆ˜μ‹μ΄λ―€λ‘œ 진행
                n1 = num.pop() # 두가지 숫자λ₯Ό λ½‘λŠ”κ±°λŠ” λͺ¨λ“  κ³Όμ •μ—μ„œ μ§„ν–‰λ˜λ―€λ‘œ 미리 λ½‘μ•„μ€Œ
                n2 = num.pop()
                new = 0

                if susik[i] == '*':
                    new = n2 * n1
                    num.append(new) # μ—°μ‚° ν›„ λ‹€μ‹œ λ¦¬μŠ€νŠΈμ— λ„£μ–΄μ€€λ‹€
                    # num.append(n2*n1) # => μ΄λŸ°μ‹μœΌλ‘œ λ°”λ‘œ μ²˜λ¦¬ν•˜λŠ”κ²Œ 더 쒋은 λ“―
                elif susik[i] == '+':
                    new = n2 + n1
                    num.append(new)
                elif susik[i] == '-':
                    new = n2 - n1
                    num.append(new)
                elif susik[i] == '/':
                    new = n2 // n1 
                    ####### 이떼 λͺ« μ—°μ‚°μžλ‘œ μ•ˆν•΄μ£Όλ©΄ λ‚˜μ€‘μ— .0이 λ‚˜μ˜€λŠ” μΌ€μ΄μŠ€κ°€ λ°œμƒν•œλ‹€!!####
                    num.append(new)

    # 리슀트의 길이가 1이 μ•„λ‹ˆλ©΄ μ—°μ‚°μžμ™€ μˆ«μžκ°€ λ‚¨μ•„μžˆκ±°λ‚˜
    # μ•„λ‹ˆλ©΄ μ•„μ˜ˆ μ—†μ–΄μ§€λŠ” ν‹€λ¦° μˆ˜μ‹μ΄λ‹€
    if len(num) != 1:
            result = 0

    if result:
        print(f'#{tc} {num[-1]}')
    else:
        print(f'#{tc} error')

#####

이 문제 ν’€λ©΄μ„œ 2가지λ₯Ό 잘λͺ»ν–ˆλŠ”데....

 

- 숫자λ₯Ό μ •μˆ˜λ‘œ μ•ˆ λ°›μ•˜μœΌλ©΄μ„œ λ‚˜μ€‘μ— int둜 값을 넣지 μ•Šμ€ 것..

- λ‚˜λˆ„κΈ° μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ λ”± μ •μˆ˜λ‘œ λ‚˜λˆ  λ–¨μ–΄μ§€λŠ” 것이 μ•„λ‹Œ κ²½μš°λ„ λ°œμƒν•˜λ―€λ‘œ // λͺ« μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€..

참고함면 쒋을 κ°œλ…λ“€ ✍️

μ€‘μœ„ ν‘œκΈ°λ²•(infix notation)

: μ—°μ‚°μžλ₯Ό ν”Όμ—°μ‚°μžμ˜ κ°€μš΄λ° ν‘œκΈ°ν•˜λŠ” 방법

  ex) A + B (μš°λ¦¬κ°€ ν‰μ†Œμ— μ‚¬μš©ν•˜λŠ” 방법)

 

ν›„μœ„ ν‘œκΈ°λ²•(postfix notation)

: μ—°μ‚°μžλ₯Ό ν”Όμ—°μ‚°μž 뒀에 ν‘œκΈ°ν•˜λŠ” 방법

 ex) AB + (컴퓨터가 μ‚¬μš©ν•˜λŠ” 방법)

 

ν›„μœ„ ν‘œκΈ°λ²•μ˜ μˆ˜μ‹μ„ μŠ€νƒμ„ μ΄μš©ν•΄μ„œ κ³„μ‚°ν•˜κΈ°

  1.  ν”Όμ—°μ‚°μžλ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒ push
  2. μ—°μ‚°μžλ₯Ό λ§Œλ‚˜λ©΄ ν•„μš”ν•œ 만큼의 ν”Όμ—°μ‚°μžλ₯Ό μŠ€νƒμ—μ„œ pop ν•˜μ—¬ μ—°μ‚°ν•˜κ³ , μ—°μ‚°κ²°κ³Όλ₯Ό λ‹€μ‹œ μŠ€νƒμ— push
  3. μˆ˜μ‹μ΄ λλ‚˜λ©΄, λ§ˆμ§€λ§‰μœΌλ‘œ μŠ€νƒμ„ popν•˜μ—¬ 좜λ ₯!!!

 

728x90
λ°˜μ‘ν˜•
728x90
λ°˜μ‘ν˜•

문제

N개의 μ •μˆ˜ A[1], A[2], …, A[N]이 μ£Όμ–΄μ Έ μžˆμ„ λ•Œ, 이 μ•ˆμ— XλΌλŠ” μ •μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 μžμ—°μˆ˜ N(1 ≤ N ≤ 100,000)이 주어진닀. λ‹€μŒ μ€„μ—λŠ” N개의 μ •μˆ˜ A[1], A[2], …, A[N]이 주어진닀. λ‹€μŒ μ€„μ—λŠ” M(1 ≤ M ≤ 100,000)이 주어진닀. λ‹€μŒ μ€„μ—λŠ” M개의 μˆ˜λ“€μ΄ μ£Όμ–΄μ§€λŠ”λ°, 이 μˆ˜λ“€μ΄ Aμ•ˆμ— μ‘΄μž¬ν•˜λŠ”μ§€ μ•Œμ•„λ‚΄λ©΄ λœλ‹€. λͺ¨λ“  μ •μˆ˜μ˜ λ²”μœ„λŠ” -231 λ³΄λ‹€ ν¬κ±°λ‚˜ κ°™κ³  231보닀 μž‘λ‹€.

좜λ ₯

M개의 쀄에 닡을 좜λ ₯ν•œλ‹€. μ‘΄μž¬ν•˜λ©΄ 1을, μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 0을 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯ 1 

5
4 1 5 2 3
5
1 3 7 9 5

예제 좜λ ₯ 1 

1
1
0
0
1

ν‹€λ¦° λ‚΄ ν’€πŸ¦·

# 1920. 수찾기
import sys
input = sys.stdin.readline

N = int(input())
arr = list(map(int, sys.stdin.readline().split()))

M = int(input())
arr_2 = list(map(int, sys.stdin.readline().split()))
result = []

for j in range(M):
    one = []
    for i in range(N):
        if arr[i] == arr_2[j]:
            one.append(1)
            break
        else:
            one.append(0)

    # print(one)
    cnt = 0
    for k in one:
        if k == 1:
            cnt += 1
    if cnt >= 1:
        result.append(1)
    else:
        result.append(0)

for k in result:
    print(k)

κ΅¬μ§κ΅¬μ§ν•˜κ²Œ 짜기 달인이 λ˜λ²„λ¦° λ‚˜,,,,

단계별 ν’€μ΄λ‘œ μ•ˆλ“€μ–΄κ°€κ³  성곡λ₯ λ‘œ λ“€μ–΄κ°€μ„œ μ•ˆ ν’€μ–΄μ Έ μžˆλŠ”κ±° 풀어가지고

μ–΄λ–€ λ°©μ‹μœΌλ‘œ ν’€μ–΄μ•Όν•˜λŠ”μ§€ 힌트(이차원 배열이닀, 정렬이닀, 이진탐색이닀 이런거)κ°€ μ—†μ–΄μ„œ 어카지 ν•˜λ‹€κ°€

μ°Ύμ•„μ•Όν•  값이 주어진 arr_2 리슀트λ₯Ό λŒλΌλ©΄μ„œ arr을 λŒλ¦¬λŠ” μ™„μ „ νƒμƒ‰μœΌλ‘œ μ°Ύμ•„μ„œ 있으면 더해주면 λ˜κ² λ‹€..

μ‹Άμ—ˆκ³  무슨일둜 인덱슀 μ•„μ›ƒμ˜€λΈŒλ ˆμΈμ§€λ„ μ•ˆλ‚˜κ³  ν•œλ²ˆμ— μ„±κ³΅ν–ˆλŠ”λ””.... ν–ˆλŠ”λ°.... μ œμΆœν–ˆλŠ”λ°...

ν–ˆλŠ”λ° μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜λ²„λ Έλ‹€ γ…‹γ…‹ ν˜Ήμ‹œλ‚˜ λͺ°λΌμ„œ import sysλ‘œλ„ λ°”κΏ”λ΄€λŠ”λ° μ‹€νŒ¨....γ…œγ…œ

μˆ˜μ •λœ λ‚΄ ν’€πŸ¦·

λ°±μ€€μ—μ„œ ν’€λ‹€κ°€ λ§‰νžˆλ©΄ μ§ˆλ¬Έκ²Œμ‹œνŒ λ“€μ–΄κ°€μ„œ μ’…μ’… 힌트λ₯Ό μ–»λŠ”λ°

λ‚˜μ²˜λŸΌ κ΅¬μ§ˆκ΅¬μ§ˆν•˜κ²Œ ν‘ΈλŠ” μ‚¬λžŒμ΄ μ—†μ—ˆκ³  γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹

set을 μ‚¬μš©ν•˜μ—¬ μž…λ ₯λ°›μ•„ μ‹œκ°„μ„ 적게 걸리게 ν•˜λŠ” λ°©λ²•μ΄λ‚˜ 이진 탐색을 μ‚¬μš©ν•˜μ˜€λ‹€!!

그러고 λ³΄λ‹ˆ 이진 탐색을 μ΄μš©ν•˜λ©΄ λ˜μ—ˆλŠ”λ° ν˜Όμžμ„œ λΈŒλ‘œλ…Έλ§ˆμŠ€(무지성)으둜 ν•˜κ³ μžˆμ—ˆλ‹€....

 

 

κ·Έλž˜μ„œ λ¨Όμ € ν•΄λ³Έ set() 으둜 μž…λ ₯ λ°›κΈ° =>

N = int(input())
arr = set(map(int, input().split())) # 좜λ ₯ μ‹œκ°„μ„ 쀄이기 μœ„ν•΄ set λ°›μŒ

M = int(input())
arr_2 = list(map(int, input().split()))

for i in arr_2:
    if i in arr: print(1)
    else: print(0)

κ²°κ³ΌλŠ” 성곡~~~~~

set을 자주 μ•ˆ μ“°λ‹€λ³΄λ‹ˆ μ–΄λ–€ λΆ€λΆ„μ—μ„œ 쓸지 λͺ°λžλŠ”데

μž…λ ₯을 set으둜 λ°›μ•„ μ‚¬μš©ν•œλ‹€λŠ” 점을 μ•Œκ²Œ λ˜μ—ˆλ‹€!!

μ΄μ§„νƒμƒ‰μœΌλ‘œ 풀은 λ‚΄ ν’€πŸ¦·

또 λ‹€λ₯Έ 방법쀑에 ν•˜λ‚˜μΈ λ°”μ΄λ„ˆλ¦¬ μ„œμΉ˜λ₯Ό ν†΅ν•œ 방법도 많이 λ³΄μ—¬μ„œ 도전해 λ³΄μ•˜λ‹€~~

N = int(input())
arr = list(map(int, input().split()))
arr.sort() # 이진탐색은 μ •λ ¬λœ 것듀 νƒμƒ‰ν•˜λŠ”λ° 이 λΆ€λΆ„ 기얡을 λͺ»ν•΄μ„œ λ¬΄ν•œ λ£¨ν”„λ‘œ λͺ‡λ²ˆ λ‹€λ…€μ™”λ‹€
M = int(input())
arr_2 = list(map(int, input().split()))

for i in arr_2:
    # λ°”μ΄λ„ˆλ¦¬ μ„œμΉ˜ ν™œμš©ν•˜κΈ°(이진탐색)
    result = False 
    start = 0 # μ‹œμž‘ 인덱슀
    end = N - 1 # 끝 인덱슀

    while start <= end:
        mid = ((start + end) // 2) # μ€‘κ°„κ°’μ˜ μœ„μΉ˜μ— ν•΄λ‹Ήν•˜λŠ” μˆ˜μ™€ λͺ©ν‘œ 비ꡐ해 λ‚˜κ°
        if i == arr[mid]: # 쀑간값과 λͺ©ν‘œκ°’이 κ°™λ‹€λ©΄
            result = True
            break
        elif i > arr[mid]:
            start = mid + 1
        else:
            end = mid - 1

    if result:
        print(1)
    else:
        print(0)

μ‹œν—˜μ—λ„ λ‚˜μ˜€κΈ°λŠ” ν–ˆμ§€λ§Œ μ˜€λžœλ§Œμ— 이진탐색을 μ‚¬μš©ν•΄μ„œ 계속 틀린값이 λ‚˜μ˜€κ³ 

λ¬΄ν•œλ£¨ν”„λ‘œ μž μ‹œ λ¨Όλ‚˜λΌμ΄μ›ƒλ‚˜λΌ λ‹€λ…€μ™”λ‹€....

쀑간값과 λͺ©ν‘œκ°’을 λΉ„κ΅ν•˜λ©΄μ„œ μ‹œμž‘μ μ΄ λ§ˆμ§€λ§‰μ λ³΄λ‹€ λ„˜μ–΄μ„œλ©΄ μ’…λ£Œλ˜λŠ” 기저쑰건을 μ„€μ •ν•˜μ˜€λ‹€!!!!

 

참고함면 쒋을 κ°œλ…λ“€ ✍️

1) 이진 검색(Binary Search)

:  자료의 κ°€μ˜¨λ°μ— μžˆλŠ” ν•­λͺ©μ˜ ν‚€ κ°’κ³Ό λΉ„κ΅ν•˜μ—¬ λ‹€μŒ κ²€μƒ‰μ˜ μœ„μΉ˜λ₯Ό κ²°μ •ν•˜κ³  검색을 계속 μ§„ν–‰ν•˜λŠ” 방법

 => λͺ©μ  ν‚€λ₯Ό 찾을 λ•ŒκΉŒμ§€ 이진 검색을 μˆœν™˜μ μœΌλ‘œ 반볡 μˆ˜ν–‰ν•¨μœΌλ‘œμ¨ 검색 λ²”μœ„λ₯Ό 반으둜 μ€„μ—¬κ°€λ©΄μ„œ 보닀 λΉ λ₯΄κ²Œ 검색을 μˆ˜ν–‰ν•œλ‹€

 

- 이진 검색을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” μžλ£Œκ°€ μ •λ ¬λœ μƒνƒœμ—¬μ•Ό ν•œλ‹€(정렬이 μ•„λ‹ˆλΌ 뒀에 μˆ˜κ°€ μ•žμ— μˆ˜λ³΄λ‹€ 컀버리면 μ˜€λ°”μžλ‚˜.. 찾을 μˆ˜κ°€ μ—†μŒ!!!!!! 주의!!!!!!!!1..)

 

- 검색 κ³Όμ •

  1. 자료의 쀑앙에 μžˆλŠ” μ›μ†Œλ₯Ό κ³ λ₯Έλ‹€
  2. 쀑앙 μ›μ†Œμ˜ κ°’κ³Ό 찾고자 ν•˜λŠ” λͺ©ν‘œ 값을 λΉ„κ΅ν•œλ‹€
  3. λͺ©ν‘œκ°’이 쀑앙 μ›μ†Œμ˜ 값보닀 μž‘μœΌλ©΄ 자료의 μ™Όμͺ½ λ°˜μ— λŒ€ν•΄μ„œ μƒˆλ‘œ 검색을 μˆ˜ν–‰, 크닀면 자료의 였λ₯Έμͺ½ λ°˜μ— λŒ€ν•΄μ„œ μ„Έλ‘œ 검색을 μˆ˜ν–‰
  4. 찾고자 ν•˜λŠ” 값을 찾을 λ–„κΉŒμ§€ 1~3의 과정을 λ°˜λ³΅ν•œλ‹€
  5. μ°ΎλŠ”λ‹€λ©΄ 성곡, λͺ» 찾으면 μ‹€νŒ¨

- κ΅¬ν˜„

  • 검색 λ²”μœ„μ˜ μ‹œμž‘μ κ³Ό μ’…λ£Œμ μ„ μ΄μš©ν•˜μ—¬ 검색을 반볡 μˆ˜ν–‰ν•œλ‹€ => while의 μ’…λ£Œ 쑰건을 잘 μ„€μ •ν•˜κΈ°
  • 이진 κ²€μƒ‰μ˜ 경우, μžλ£Œμ— μ‚½μž…μ΄λ‚˜ μ‚­μ œκ°€ λ°œμƒν–ˆμ„ λ•Œ λ°°μ—΄μ˜ μƒνƒœλ₯Ό 항상 μ •λ ¬ μƒνƒœλ‘œ μœ μ§€ν•˜λŠ” μΆ”κ°€ μž‘μ—…μ΄ ν•„μš”
# 이진 검색 μ•Œκ³ λ¦¬μ¦˜
def binarySweach(a, N, key):
	start = 0  # μ‹œμž‘μ  
    end = N -1  # μ’…λ£Œμ 
    while start <= end:
    	middle = (start + end) // 2 # λͺ«μœΌλ‘œ ν•˜λŠ” 이유 : λ‚˜λˆ„κΈ° μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ .0으둜 floatλ˜κ±Έλž‘
        if a[middle] == key: # 검색 성곡
        	 return true
        elif a[middle] > key:
        	 end = middle - 1
        else:
        	start = middle + 1
    return flase # while 문을 λ‹€ λŒμ•˜λŠ”λ°λ„ 찾지λͺ»ν•œλ‹€λ©΄ 검색 μ‹€νŒ¨

 

728x90
λ°˜μ‘ν˜•

+ Recent posts