728x90
λ°˜μ‘ν˜•

문제 😡‍πŸ’«

μˆ˜λΉˆμ΄λŠ” 동생과 μˆ¨λ°”κΌ­μ§ˆμ„ ν•˜κ³ μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” ν˜„μž¬ 점N에 있고 동생은 점 K에 μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” κ±·κ±°λ‚˜ μˆœκ°„μ΄λ™μ„ ν•  수 μžˆλ‹€. λ§Œμ•½, 수빈이의 μœ„μΉ˜κ°€ X일 λ•Œ κ±·λŠ”λ‹€λ©΄ 1초 후에 X-1 λ˜λŠ” X+1둜 μ΄λ™ν•˜κ²Œ λœλ‹€, μˆœκ°„μ΄λ™μ„ ν•˜λŠ” κ²½μš°μ—λŠ” 1초 후에 2 * X의 μœ„μΉ˜λ‘œ μ΄λ™ν•˜κ²Œ λœλ‹€

 

μˆ˜λΉˆμ΄μ™€ λ™μƒμ˜ μœ„μΉ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μˆ˜λΉˆμ΄κ°€ 동생을 찾을 수 μžˆλŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ΄ λͺ‡ 초 후인지 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯!

첫 번째 쀄에 μˆ˜λΉˆμ΄κ°€ μžˆλŠ” μœ„μΉ˜ Nκ³Ό 동생이 μžˆλŠ” μœ„μΉ˜ Kκ°€ 주어진닀. Nκ³Ό KλŠ” μ •μˆ˜μ΄λ‹€.

 

좜λ ₯!

μˆ˜λΉˆμ΄κ°€ 동생을 μ°ΎλŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ„ 좜λ ₯ν•œλ‹€.4

 

λ‚΄ ν’€πŸ¦·

# 1697. μˆ¨λ°”κΌ­μ§ˆ
from collections import deque
def bfs(start, depth):
    visited = [0] * 100001
    q = deque()
    q.append((start, depth))
    visited[start] = 1
    while q:
        s, d = q.popleft()

        if s == K:
            return d

        for nxt_s in [s-1, s+1, s*2]:
            if 0 <= nxt_s <= 100000 and (not visited[nxt_s] or visited[nxt_s] > d+1):
                q.append((nxt_s, d+1))
                visited[nxt_s] = d+1

N, K = map(int, input().split())
visited = [0] * K
result = dfs(N, 0)
print(result)

 

 μ²˜μŒμ— λ„λŒ€μ²΄κ°€ μ–΄λ–»κ²Œ 접근해야할지도 λͺ¨λ₯΄κ² κ³  dpλ‚˜ while문으둜 ν’€μ–΄μ•Όκ² λ‹€ μ‹Άμ—ˆλŠ”λ° μ•Œκ³ λ³΄λ‹ˆ bfs λ¬Έμ œμ˜€λ‹€γ…œγ…œ

μ‹œμž‘μ κ³Ό 깊이λ₯Ό λ„£μ–΄μ„œ μ‹œμž‘μ μ΄ 끝점과 같아지면 return으둜 깊이λ₯Ό λ°›μ•„μ£Όλ©΄ μ΅œμ†Œκ°’μ„ ꡬ할 수 μžˆλ‹€!!

μ–΄λ €μ› λ˜ 뢀뢄은 λ°©λ¬Έ ν–ˆλ˜ κ³³ λ˜λŠ” κΉŠμ΄κ°€ 더 κΉŠμ€κ³³κ³Ό κ·Έμ „κΉŒμ§€μ˜ κΉŠμ΄μ— ν•΄λ‹Ήν•˜λŠ” 값이 κ°™μ•˜μ„λ•ŒλŠ” λ°°μ œν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμ΄μ—ˆλ‹€... λ‹€λ₯Έ λΆ„λ“€ μ½”λ“œλ₯Ό λ³΄μ•˜μ„λ•ŒλŠ” 이미 λ°©λ¬Έν•œκ³³μ„ continue둜 λ„˜κ²¨μ„œ κ°„λ‹¨νžˆ ν•΄κ²°ν•΄ μ£ΌλŠ”κ²ƒμ„ λ³Ό 수 μžˆμ—ˆλ‹€...μ–΄λ–»κ²Œ ν’€μ–΄μ•Όν• μ§€κΉŒμ§€ κ³ λ―Όν•œ λ¬Έμ œλŠ” 였랜만이라 λ”μš± νž˜λ“€μ—ˆλ‹€ πŸ˜‚πŸ˜‚πŸ˜‚πŸ˜‚

 

 

 

 

 

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

μœ νŠœλ²„ 딩코딩씨 보고 μ •λ¦¬ν•΄λ³΄λŠ” μˆœμ—΄κ³Ό μ‘°ν•©...

μž¬κ·€, λ°±νŠΈλž˜ν‚Ή, dfs... λ“±λ“± 정말 많이 μ—°κ΄€λ˜μ–΄μžˆμ–΄μ„œ μ •λ¦¬ν•˜λ©΄ 쒋을것 κ°™μ•„ μ˜¬λ €λ΄…λ‹ˆλ‹€...

##### permutation(μˆœμ—΄)

'''
μˆœμ—΄ : permutation(ν¬ν•¨λ˜μ–΄ μžˆλŠ” μˆ˜κ°€ 같은 μˆ˜μ—¬λ„ μˆœμ„œκ°€ λ‹€λ₯΄λ©΄ λ‹€λ₯Έκ±Έλ‘œ μΉœλ‹€)
dfs νŠΈλ¦¬μ™€ 체크리슀트 μ‚¬μš©

3개의 곡 쀑에 2개λ₯Ό λ½‘λŠ” 경우(3P2)
μ‚¬μš©ν•œ 경우 λ„£μœΌλ©΄ μ•ˆλ˜λ―€λ‘œ 체크리슀트 μ‚¬μš©ν•˜λŠ” κ²ƒμž„....
깊이 + 1 ν•œν›„ 길이에 λ§žλŠ” 값을 리턴을 ν•˜κ³ λ‚˜λ©΄
λ‹€μ‹œ μ²΄ν¬λ¦¬μŠ€νŠΈμ— λΉΌμ€˜μ„œ λ‹€μ‹œ 넣을 수 μžˆλ„λ‘ ν•΄μ€€λ‹€..

1 2
1 3
2 1
2 3
3 1
3 2
6가지
'''

def dfs(L):
    # μ’…λ£Œ 쑰건
    # 리슀트의 길이가 μ°Ύμ•„μ•Ό ν•  개수(r)κ°€ λœλ‹€λ©΄ μ’…λ£Œ
    if L == r:
        print(result)
    else:
        for i in range(len(n)):
            # μ²΄ν¬λ¦¬μŠ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” 값이 μ—†λ‹€λ©΄
            if checklist[i] == 0:
                # result λ¦¬μŠ€νŠΈμ— 값을 μΆ”κ°€
                result[L] = n[i]
                # μ²΄ν¬λ¦¬μŠ€νŠΈμ— 값이 생겼닀고 ν‘œμ‹œν•΄μ£ΌκΈ°
                checklist[i] = 1
                # λ‹€μŒ 깊이둜 이동
                dfs(L+1)
                # λ‹€μŒ λ²ˆμ— λ‹€μ‹œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ λΉΌμ€€λ‹€κ³  κ·Έλƒ₯ μƒκ°ν•˜μ…ˆ ^^;;;
                checklist[i] = 0

n = [1, 2, 3]
r = 2
result = [0] * r
checklist = [0] * len(n)
dfs(0)

 

이해도 μ΄ν•΄μ§€λ§Œ μ–΄λŠμ •λ„ μ™ΈμšΈλ§ŒνΌμ€ μ™Έμš°λΌκ³  ν•˜μ‹¬...

이해해야 μ™Έμš°μ§€ 싢닀가도 μ΄λŸ¬λ‹€κ°€ 진도가 영 μ•ˆλ‚˜κ°ˆκ±° κ°™μ•„μ„œ μ λ‹Ήνžˆ μ΄ν•΄μ‹œμΌœμ„œ μ™Έμš°λŠ”κ²ƒμ΄ 쒋을 λ“―...

 

'''
μ‘°ν•© : 같은 μˆ«μžκ°€ ν¬ν•¨λ˜μ–΄ 있으면 같은 걸둜 인정....
μˆœμ—΄λ³΄λ‹€ 경우의 μˆ˜κ°€ 훨씬 μž‘μŒ...
μˆœμ—΄λ³΄λ‹€ 더 간단...
ν•œλ²ˆ 썼으면 λ‹€μ‹œ 쓰지λ₯Ό μ•ŠμœΌλ‹ˆκΉŒ μ²΄ν¬λ¦¬μŠ€νŠΈλ„ ν•„μš”μ—†μŒ...
DFS 트리λ₯Ό μ΄μš©ν•΄μ„œ ν‘Όλ‹€

3C2

1 2
1 3
2 3

3가지
'''
def dfs(L, BeginWith):
    # μ’…λ£Œ 쑰건
    if L == r:
        print(*result)
    else:
        for i in range(BeginWith, len(n)): # μ‹œμž‘ν•˜λŠ” κ°’λΆ€ν„° λκΉŒμ§€
            result[L] = n[i] # ν•΄λ‹Ήν•˜λŠ” 값을 λ„£μ–΄μ£ΌκΈ°
            dfs(L+1, i+1) # λ‹€μŒ 깉이 λ‹€μŒ 숫자둜 μ΄λ™ν•˜μ—¬ μ „ 값을 λ“€μ–΄μ˜€μ§€ λͺ»ν•˜λ„둝


n = [1, 2, 3]
r = 2
result = [0] * r

dfs(0, 0) # level, begin(μ–΄λ””μ„œ μ‹œμž‘ν• μ§€)
728x90
λ°˜μ‘ν˜•
728x90
λ°˜μ‘ν˜•

 

문제 😡‍πŸ’«

2차원 평면 μœ„μ˜ 점 Nκ°œκ°€ 주어진닀. μ’Œν‘œλ₯Ό yμ’Œν‘œκ°€ μ¦κ°€ν•˜λŠ” 순으둜, yμ’Œν‘œκ°€ κ°™μœΌλ©΄ xμ’Œν‘œκ°€ μ¦κ°€ν•˜λŠ” μˆœμ„œλ‘œ μ •λ ¬ν•œ λ‹€μŒ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” i번점의 μœ„μΉ˜ xi와 yiκ°€ 주어진닀. (-100,000 ≤ xi, yi ≤ 100,000) μ’Œν‘œλŠ” 항상 μ •μˆ˜μ΄κ³ , μœ„μΉ˜κ°€ 같은 두 점은 μ—†λ‹€.

좜λ ₯

첫째 쀄뢀터 N개의 쀄에 점을 μ •λ ¬ν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€.

 

ν‹€λ¦° λ‚΄ ν’€ 🦷

# 11651. μ’Œν‘œ μ •λ ¬ν•˜κΈ°2

N = int(input())
result = []
for _ in range(N):
    x, y = map(int, input().split())
    result.append([x, y])

# for k in result:
#     print(k[-1])

for i in range(N-1):
    if result[i][-1] > result[i+1][-1]:
        result[i], result[i+1] = result[i+1], result[i]
        # print(result)
for i in range(N-1):
    if result[i][-1] > result[i+1][-1]:
        result[i], result[i+1] = result[i+1], result[i]

for s in result:
    print(*s)

μ²˜μŒμ—λŠ” μ•žμ—κ²ƒλΆ€ν„° λΉ„κ΅ν•˜λ©΄μ„œ μ•žμ—κ°’μ΄ 뒀에값보닀 크면 λ°”κΏ”μ£ΌλŠ” λŠλ‚ŒμœΌλ‘œ λ‘œμ§μ„ κ΅¬μ„±ν–ˆλŠ”λ°... for문을 λ‘λ²ˆ λŒλ¦¬λ‹ˆκΉŒ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 닡은 λ‚˜μ™”λŠ”λ° μ•„λ§ˆ νžˆλ“ μΌ€μ΄μŠ€λ“€μ€ λ‹€ κ±Έλ €μ„œ νŽ˜μΌμ„ λ°›μ•˜λ‹€...

μ•„λ§ˆ λ‹€λ₯Έ 애듀은 λ‘λ²ˆμœΌλ‘œ μ•ˆλ˜κ² μ§€..

κ·Έλž˜μ„œ μ–΄λ–€ λ°©λ²•μœΌλ‘œ ν•˜λ©΄ μ’‹μ„κΉŒ λ‹€μ‹œ 생각해보닀가...

y값을 μ°¨λ‘€λ‘œ μ •λ ¬ν•˜λ©΄ λ˜λ‹ˆκΉŒ λ¨Όμ € λ°›μ•„μ„œ μ†ŒνŠΈ??

 

λ‚΄ ν’€ 🦷

# 11651. μ’Œν‘œ μ •λ ¬ν•˜κΈ°2
import sys
input = sys.stdin.readline
N = int(input())
result = []

# y κ°’μ˜ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ 
for _ in range(N):
    x, y = map(int, input().split())
    result.append([y, x])

result.sort()
# print(result)

for y, x in result:
    print(x, y)

κ²°κ³ΌλŠ” μ„±κ³΅μ΄μ—ˆλ‹€!!!! 생각보닀 λ„ˆλ¬΄ κ°„λ‹¨ν•˜κ²Œ ν•΄κ²° γ…‹γ…‹γ…‹γ…‹γ…‹

그러고 λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ 풀이λ₯Ό λ΄€λŠ”λ° 정말 λ§Žμ€ μ‚¬λžŒλ“€μ΄ λžŒλ‹€λ₯Ό 많이 μ‚¬μš©ν•˜μ…¨λ‹€...

잘 λͺ°λΌμ„œ λͺ» 쓰기도 ν–ˆμ–΄μ„œ μ΄λ²ˆκΈ°νšŒμ— κ³΅λΆ€ν•˜κΈ°λ‘œ ν–ˆλ‹€ ^^

 

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

 

- sorted()μ—μ„œ key lambda μ‚¬μš© (μ˜€λ¦„μ°¨μˆœμ΄ κΈ°λ³Έ)

 

  • λ‹¨μˆœνžˆ sorted만 μ‚¬μš©ν•œ 경우
a = [(0, 4), (1, 2), (1, -1), (2, 2), (3, 3)]
b = sorted(a)  # a.sort()와 동일
print(b)

# [(0, 4), (1,  -1), (1, 2), (2, 2), (3, 3)]
# 사싀 ꡳ이 λžŒλ‹€λ‘œ μ–΄λ ΅κ²Œ μ•ˆ μ“°κ³ ... 거꾸둜 λ°›μ•„μ„œ μ •λ ¬ν•˜λŠ”κ²Œ 더 쒋은듯 ^^^^^^^^

 

  • key μΈμžμ— ν•¨μˆ˜λ₯Ό λ„˜κ²¨μ€€ 경우
  1. 첫번째 λ“€μ–΄μžˆλŠ” 값을 μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•΄μ€€ 경우
a = [(0, 4), (1, 2), (1, -1), (2, 2), (3, 3)]
c = sorted(a, key = lambda x : x[0])
print(c)

# [(0, 4), (1, -1), (1, 2), (2, 2), (3, 3)]
# μ•žμ˜ 인자의 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜λŠ”κ²ƒμ„ λ³Ό 수 μžˆλ‹€

 

  2. λ‘λ²ˆμ§Έ λ“€μ–΄μžˆλŠ” 값을 μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•΄μ€€ 경우

a = [(0, 4), (1, 2), (1, -1), (2, 2), (3, 3)]
d = sorted(a, key = lambda x : x[1])
print(d)

# [(1, -1), (1, 2), (2, 2), (3, 3), (0, 4)]
# λ’€μ˜ 인자의 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜λŠ”κ²ƒμ„ λ³Ό 수 μžˆλ‹€

   

   3. 첫번째 λ“€μ–΄μžˆλŠ” 값은 μ˜€λ¦„μ°¨μˆœ, λ‘λ²ˆμ§Έ λ“€μ–΄μžˆλŠ” 값은 λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ν•΄μ€€ 경우

# λ‚΄λ¦Όμ°¨μˆœμ€ μ•žμ— -λ₯Ό λΆ™μ—¬μ£Όλ©΄ λœλ‹€!!
e = sorted(a, key = lambda x = (x[0], -x[1]))
print(e)

# [(0, 4), (1, 2), (1, -1), (2, 2), (3, 3)]

 


 

# 11651. μ’Œν‘œ μ •λ ¬ν•˜κΈ°2
import sys
input = sys.stdin.readline
N = int(input())
result = []

# x값에 상관없이 y 값을 μ •λ ¬ => y κ°’ μ •λ ¬
for _ in range(N):
    x, y = map(int, input().split())
    result.append([x, y])

ans = sorted(result, key = lambda x : (x[1], x[0]))
for x, y in ans:
    print(x, y)

 

배운 것을 ν† λŒ€λ‘œ λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ‹œ 문제λ₯Ό ν’€λ©΄ μ΄λŸ¬ν•œ μ½”λ“œλ₯Ό 얻을 수 μžˆλ‹€!!

λ‹€μŒ μ •λ ¬ λ¬Έμ œλŠ” λžŒλ‹€λ‘œ 도전해봐야겠닀 πŸ˜‚πŸ˜‚πŸ˜‚

 

 

 

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

였늘 친 μ‹œν—˜ λ¬Έμ œμ€‘μ— bfs, dfs  문제 해결을 ν•˜μ§€ λͺ»ν•΄μ„œ 볡슡 ν•˜λ €λ‹€κ°€ μ‹œν—˜ 친 κΈ°λ…μœΌλ‘œ(?)πŸ˜‚πŸ˜‚πŸ˜‚

단계별 μœ„μ— μ•ˆ ν‘Όκ±° 쀑에 7단계 μΌλ°˜μˆ˜ν•™μ„ λ§ˆλ¬΄λ¦¬ν•˜κΈ°λ‘œν–ˆλ‹€!!! 

λŒ€λΆ€λΆ„ 브둠즈고 κ·œμΉ™λ§Œ 찾으면 ν•΄κ²° κ°€λŠ₯ν•œ κ°„λ‹¨ν•œ 문제인데 λΆ„μˆ˜μ°ΎκΈ°κ°€ 골머리가 쑰금 μ•„νŒ λ‹€ ^________^

 

λ¬Έμ œπŸ€”

λ¬΄ν•œνžˆ 큰 배열에 λ‹€μŒκ³Ό 같이 λΆ„μˆ˜λ“€μ΄ μ ν˜€μžˆλ‹€.

1/1 1/2 1/3 1/4 1/5
2/1 2/2 2/3 2/4
3/1 3/2 3/3
4/1 4/2
5/1

이와 같이 λ‚˜μ—΄λœ λΆ„μˆ˜λ“€μ„ 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … κ³Ό 같은 μ§€κ·Έμž¬κ·Έ μˆœμ„œλ‘œ μ°¨λ‘€λŒ€λ‘œ 1번, 2번, 3번, 4번, 5번, … λΆ„μˆ˜λΌκ³  ν•˜μž.

Xκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, X번째 λΆ„μˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 X(1 ≤ X ≤ 10,000,000)κ°€ 주어진닀.

좜λ ₯

첫째 쀄에 λΆ„μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€.

 

λ‚΄ ν’€πŸ¦·

# 1193. λΆ„μˆ˜ μ°ΎκΈ°
N = int(input())

line = 0 # λŒ€κ°μ„  갯수
idx = 0 # λ§ˆμ§€λ§‰ 인덱슀 (1, 3, 6, 10...)
while idx < N:
    line += 1
    idx += line # λ§ˆμ§€λ§‰ μΈλ±μŠ€λŠ” 라인에 μžˆλŠ” λΆ„μžμ˜ 갯수 만큼 λŠ˜μ–΄λ‚œλ‹€

result = []
# 라인 ν™€μˆ˜μΌ λ–Ό
if line % 2:
    ja = idx - N + 1     # λΆ„μž
    mo = line - idx + N  # λΆ„λͺ¨
    result.append(ja)
    result.append('/')
    result.append(mo)
else:
    ja = line - idx + N
    mo = idx - N + 1
    result.append(ja)
    result.append('/')
    result.append(mo)
    
print(''.join(map(str, result)))

λ­”κ°€ λŠλ‚Œμ μΈ λŠλ‚Œμ€ μ•Œκ² λŠ”λ° μ°ΎκΈ° 쉽지 μ•Šμ•˜μ§€λ§Œ λΆ„μˆ˜λ₯Ό ν•˜λ‚˜ν•˜λ‚˜ 적고 λœ―μ–΄λ³΄λ©΄ κ·œμΉ™μ„ 찾을 수 μžˆμ—ˆλ‹€!!  γ…œγ…œγ…œ

Nλ§Œμ„ 가지고 λΆ„μžμ™€ λΆ„λͺ¨λ₯Ό μ–΄λ–»κ²Œ 적어야할지λ₯Ό 제일 고민을 많이 ν–ˆλ˜ 뢀뢄인것 κ°™λ‹€.....

ja = λΆ„μž / mo = λΆ„λͺ¨ μž…λ‹ˆλ‹€ γ…‹γ…‹γ…‹

 

 

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

  • 리슀트λ₯Ό λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ 좜λ ₯ν•˜κΈ°
result = [1, 2, 3, 4]
# 곡백없이 좜λ ₯
print(''.join(map(str, result)))   # 1234
# 곡백있이 좜λ ₯
print(' '.join(map(str, result)))  # 1 2 3 4
# , μ‰Όν‘œλ‘œ μ—°κ²°ν•˜μ—¬ 좜λ ₯
print(', '.join(map(str, result))  # 1, 2, 3, 4
# μ–ΈνŒ¨ν‚Ή
print(*result)                     # 1 2 3 4

 

728x90
λ°˜μ‘ν˜•
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