KR_For - somaz94/python-study GitHub Wiki

Python ๋ฐ˜๋ณต๋ฌธ(For) ๊ฐœ๋… ์ •๋ฆฌ


1๏ธโƒฃ for๋ฌธ์ด๋ž€?

for๋ฌธ์€ ์‹œํ€€์Šค(๋ฆฌ์ŠคํŠธ, ํŠœํ”Œ, ๋ฌธ์ž์—ด ๋“ฑ)์˜ ์š”์†Œ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์ด๋‹ค. while๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ ์ •ํ•ด์ง„ ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

# ๊ธฐ๋ณธ for๋ฌธ ๊ตฌ์กฐ
for ๋ณ€์ˆ˜ in ์‹œํ€€์Šค:
    ์ˆ˜ํ–‰ํ• _๋ฌธ์žฅ1
    ์ˆ˜ํ–‰ํ• _๋ฌธ์žฅ2
    ...

# ์˜ˆ์ œ
fruits = ['apple', 'banana', 'orange']
for fruit in fruits:
    print(fruit)

โœ… ํŠน์ง•:

  • ์‹œํ€€์Šค์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ˆœํšŒ
  • ์ž๋™์œผ๋กœ ๋‹ค์Œ ์š”์†Œ๋กœ ์ด๋™
  • ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ์ฝ”๋“œ ๋ธ”๋ก ๊ตฌ๋ถ„


2๏ธโƒฃ range() ํ•จ์ˆ˜

# range() ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•
for i in range(5):          # 0๋ถ€ํ„ฐ 4๊นŒ์ง€
    print(i)

# ์‹œ์ž‘๊ณผ ๋ ์ง€์ •
for i in range(1, 6):      # 1๋ถ€ํ„ฐ 5๊นŒ์ง€
    print(i)

# ์Šคํ… ์ง€์ •
for i in range(0, 10, 2):  # 0๋ถ€ํ„ฐ 9๊นŒ์ง€ 2์”ฉ ์ฆ๊ฐ€
    print(i)               # 0, 2, 4, 6, 8 ์ถœ๋ ฅ

โœ… range() ํŠน์ง•:

  • range(๋): 0๋ถ€ํ„ฐ ๋-1๊นŒ์ง€
  • range(์‹œ์ž‘, ๋): ์‹œ์ž‘๋ถ€ํ„ฐ ๋-1๊นŒ์ง€
  • range(์‹œ์ž‘, ๋, ์Šคํ…): ์‹œ์ž‘๋ถ€ํ„ฐ ๋-1๊นŒ์ง€ ์Šคํ…๋งŒํผ ์ฆ๊ฐ€


3๏ธโƒฃ ๋ฐ˜๋ณต๋ฌธ ์ œ์–ด

# break ์‚ฌ์šฉ
for i in range(10):
    if i == 5:
        break
    print(i)

# continue ์‚ฌ์šฉ
for i in range(10):
    if i % 2 == 0:
        continue    # ์ง์ˆ˜๋ฉด ๊ฑด๋„ˆ๋›ฐ๊ธฐ
    print(i)       # ํ™€์ˆ˜๋งŒ ์ถœ๋ ฅ

โœ… ์ œ์–ด๋ฌธ:

  • break: ๋ฐ˜๋ณต๋ฌธ ์™„์ „ํžˆ ์ข…๋ฃŒ
  • continue: ํ˜„์žฌ ๋ฐ˜๋ณต ๊ฑด๋„ˆ๋›ฐ๊ธฐ


4๏ธโƒฃ ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜

# ๊ธฐ๋ณธ ํ˜•ํƒœ
squares = [x**2 for x in range(10)]

# ์กฐ๊ฑด๋ฌธ ํฌํ•จ
even_squares = [x**2 for x in range(10) if x % 2 == 0]

# ์ค‘์ฒฉ ๋ฐ˜๋ณต๋ฌธ
matrix = [[i*j for j in range(3)] for i in range(3)]

# ๊ธฐ์กด ๋ฐฉ์‹๊ณผ ๋น„๊ต
# ๊ธฐ์กด ๋ฐฉ์‹
squares = []
for x in range(10):
    squares.append(x**2)

# ์ปดํ”„๋ฆฌํ—จ์…˜
squares = [x**2 for x in range(10)]

โœ… ์ปดํ”„๋ฆฌํ—จ์…˜ ์žฅ์ :

  • ์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ
  • ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • ์ง๊ด€์ ์ธ ํ‘œํ˜„


5๏ธโƒฃ ํ™œ์šฉ ์˜ˆ์ œ

# ๊ตฌ๊ตฌ๋‹จ ์ถœ๋ ฅ
for i in range(2, 10):
    for j in range(1, 10):
        print(f"{i} x {j} = {i*j}")
    print()

# ๋ฆฌ์ŠคํŠธ ์ˆœํšŒํ•˜๋ฉฐ ์ฒ˜๋ฆฌ
scores = [90, 85, 77, 65, 97]
for i, score in enumerate(scores):
    print(f"ํ•™์ƒ{i+1}: {score}์ ")

# ๋”•์…”๋„ˆ๋ฆฌ ์ˆœํšŒ
person = {'name': 'John', 'age': 30, 'city': 'Seoul'}
for key, value in person.items():
    print(f"{key}: {value}")

โœ… ํ™œ์šฉ Tip:

  • enumerate(): ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ ํ•จ๊ป˜ ์ˆœํšŒ
  • zip(): ์—ฌ๋Ÿฌ ์‹œํ€€์Šค ๋™์‹œ ์ˆœํšŒ
  • items(): ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ‚ค-๊ฐ’ ์Œ ์ˆœํšŒ


6๏ธโƒฃ ๊ณ ๊ธ‰ ์ปดํ”„๋ฆฌํ—จ์…˜ ๊ธฐ์ˆ 

๋ฆฌ์ŠคํŠธ, ๋”•์…”๋„ˆ๋ฆฌ, ์„ธํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜์„ ํ™œ์šฉํ•œ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•์ด๋‹ค.

# ๋”•์…”๋„ˆ๋ฆฌ ์ปดํ”„๋ฆฌํ—จ์…˜
word_lengths = {word: len(word) for word in ['apple', 'banana', 'orange']}
# ๊ฒฐ๊ณผ: {'apple': 5, 'banana': 6, 'orange': 6}

# ์„ธํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜
unique_lengths = {len(word) for word in ['apple', 'banana', 'orange', 'pear']}
# ๊ฒฐ๊ณผ: {4, 5, 6}

# ์ค‘์ฒฉ ์ปดํ”„๋ฆฌํ—จ์…˜๊ณผ ์กฐ๊ฑด
flattened = [num for row in [[1, 2], [3, 4], [5, 6]] for num in row if num % 2 == 0]
# ๊ฒฐ๊ณผ: [2, 4, 6]

# ์กฐ๊ฑด๋ถ€ ๊ฐ’ ํ• ๋‹น
scores = [85, 92, 78, 90, 55]
grades = ['A' if score >= 90 else 'B' if score >= 80 else 'C' if score >= 70 else 'F' for score in scores]
# ๊ฒฐ๊ณผ: ['B', 'A', 'C', 'A', 'F']

# ์กฐ๊ฑด๋ถ€ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ ํ•„ํ„ฐ๋ง๊ณผ ๋ณ€ํ™˜
data = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 17}, {'name': 'Charlie', 'age': 30}]
adult_names = [person['name'] for person in data if person['age'] >= 18]
# ๊ฒฐ๊ณผ: ['Alice', 'Charlie']

โœ… ๊ณ ๊ธ‰ ์ปดํ”„๋ฆฌํ—จ์…˜ ํŠน์ง•:

  • ๋‹ค์ค‘ ๋ฐ˜๋ณต๋ฌธ ์ง€์›
  • ํ•„ํ„ฐ๋ง๊ณผ ๋ณ€ํ™˜ ๋™์‹œ ์ˆ˜ํ–‰
  • ์ค‘์ฒฉ ์ž๋ฃŒ๊ตฌ์กฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • ์ง๊ด€์ ์ธ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ


7๏ธโƒฃ for ๋ฐ˜๋ณต๋ฌธ๊ณผ, ์ดํ„ฐ๋ ˆ์ดํ„ฐ, ์ œ๋„ˆ๋ ˆ์ดํ„ฐ

ํŒŒ์ด์ฌ์˜ ๋ฐ˜๋ณต ๊ด€๋ จ ๊ณ ๊ธ‰ ๊ฐœ๋…๋“ค์„ ์‚ดํŽด๋ณธ๋‹ค.

# ์ดํ„ฐ๋Ÿฌ๋ธ”๊ณผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ
iterable = [1, 2, 3]
iterator = iter(iterable)

print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3
# print(next(iterator))  # StopIteration ์˜ˆ์™ธ ๋ฐœ์ƒ

# ๊ฐ„๋‹จํ•œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜
def count_up_to(max):
    count = 1
    while count <= max:
        yield count
        count += 1

# ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์‚ฌ์šฉ
counter = count_up_to(5)
for num in counter:
    print(num)  # 1, 2, 3, 4, 5 ์ถœ๋ ฅ

# ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ปดํ”„๋ฆฌํ—จ์…˜ (์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ‘œํ˜„์‹)
gen = (x**2 for x in range(5))
for value in gen:
    print(value)  # 0, 1, 4, 9, 16 ์ถœ๋ ฅ

# ๋ฌดํ•œ ์‹œํ€€์Šค ์ƒ์„ฑ
def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

# ๋ฌดํ•œ ์‹œํ€€์Šค์—์„œ ์ผ๋ถ€๋งŒ ์‚ฌ์šฉ
sequence = infinite_sequence()
for i, num in enumerate(sequence):
    print(num)
    if i >= 9:  # 10๊ฐœ๋งŒ ์ถœ๋ ฅ
        break

โœ… ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์žฅ์ :

  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ (ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ฐ’ ์ƒ์„ฑ)
  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉ
  • ์ง€์—ฐ ํ‰๊ฐ€(Lazy Evaluation)
  • ๋ฌดํ•œ ์‹œํ€€์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์˜ˆ์ธก ๊ฐ€๋Šฅ


8๏ธโƒฃ for๋ฌธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•

์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด๋‹ค.

import time

# 1. ๋ฃจํ”„ ๋‚ด๋ถ€ ์ตœ์†Œํ™”
# ๋น„ํšจ์œจ์  ๋ฐฉ๋ฒ•
start = time.time()
result = []
for i in range(1000000):
    # ๋ฃจํ”„ ๋‚ด๋ถ€์—์„œ ๊ณ„์‚ฐ์ด ๋ฐ˜๋ณต๋จ
    result.append(i ** 2 + 2 * i + 1)
print(f"์‹œ๊ฐ„: {time.time() - start:.4f}์ดˆ")

# ์ตœ์ ํ™” ๋ฐฉ๋ฒ•
start = time.time()
result = [(i ** 2 + 2 * i + 1) for i in range(1000000)]
print(f"์‹œ๊ฐ„: {time.time() - start:.4f}์ดˆ")

# 2. ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ค„์ด๊ธฐ
# ๋น„ํšจ์œจ์  ๋ฐฉ๋ฒ•
start = time.time()
data = [1, 2, 3, 4, 5] * 1000000
length = 0
for item in data:
    length += len(str(item))  # ๋งค๋ฒˆ str() ํ•จ์ˆ˜ ํ˜ธ์ถœ
print(f"์‹œ๊ฐ„: {time.time() - start:.4f}์ดˆ")

# ์ตœ์ ํ™” ๋ฐฉ๋ฒ•
start = time.time()
data = [1, 2, 3, 4, 5] * 1000000
str_data = [str(item) for item in data]  # ๋จผ์ € ๋ณ€ํ™˜
length = 0
for s in str_data:
    length += len(s)
print(f"์‹œ๊ฐ„: {time.time() - start:.4f}์ดˆ")

์ถ”๊ฐ€ ์ตœ์ ํ™” ํŒ:

1. ์ง€์—ญ ๋ณ€์ˆ˜ ํ™œ์šฉ

# ๋น„ํšจ์œจ์  ๋ฐฉ๋ฒ• (์ „์—ญ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต ์ฐธ์กฐ)
def process_data(items):
    result = []
    for item in items:
        result.append(len(item))
    return result

# ์ตœ์ ํ™” ๋ฐฉ๋ฒ• (์ง€์—ญ ๋ณ€์ˆ˜์— ํ•จ์ˆ˜ ๋ฐ”์ธ๋”ฉ)
def process_data_optimized(items):
    result = []
    _len = len  # ์ง€์—ญ ๋ณ€์ˆ˜์— ํ•จ์ˆ˜ ๋ฐ”์ธ๋”ฉ
    _append = result.append
    for item in items:
        _append(_len(item))
    return result

2. ์ ์ ˆํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์„ ํƒ

# ๋น„ํšจ์œจ์  ๋ฐฉ๋ฒ• (๋ฆฌ์ŠคํŠธ์—์„œ ๊ฒ€์ƒ‰)
data = list(range(10000))
count = 0
for i in range(1000):
    if i in data:  # O(n) ๊ฒ€์ƒ‰
        count += 1

# ์ตœ์ ํ™” ๋ฐฉ๋ฒ• (์„ธํŠธ์—์„œ ๊ฒ€์ƒ‰)
data_set = set(range(10000))  # O(1) ๊ฒ€์ƒ‰
count = 0
for i in range(1000):
    if i in data_set:
        count += 1

โœ… ์ตœ์ ํ™” ํ•ต์‹ฌ ์›์น™:

  • ๋ฃจํ”„ ๋‚ด๋ถ€ ์—ฐ์‚ฐ ์ตœ์†Œํ™”
  • ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ
  • ์ ์ ˆํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์„ ํƒ
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ตœ์†Œํ™”
  • ๋‚ด์žฅ ํ•จ์ˆ˜์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ


9๏ธโƒฃ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์™€ ๋ฐ˜๋ณต๋ฌธ

๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ/์Šค๋ ˆ๋”ฉ์„ ์ด์šฉํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•์ด๋‹ค.

import concurrent.futures
import time

# ์ฒ˜๋ฆฌํ•  ์ž‘์—…
def process_item(item):
    time.sleep(0.1)  # ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—… ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    return item * item

# ๊ธฐ๋ณธ์ ์ธ for ๋ฐ˜๋ณต๋ฌธ
def sequential_process():
    start = time.time()
    items = list(range(100))
    results = []
    for item in items:
        results.append(process_item(item))
    print(f"์ˆœ์ฐจ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: {time.time() - start:.2f}์ดˆ")
    return results

# ThreadPoolExecutor๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
def parallel_process_threads():
    start = time.time()
    items = list(range(100))
    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
        results = list(executor.map(process_item, items))
    print(f"์Šค๋ ˆ๋“œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: {time.time() - start:.2f}์ดˆ")
    return results

# ProcessPoolExecutor๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
def parallel_process_processes():
    start = time.time()
    items = list(range(100))
    with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
        results = list(executor.map(process_item, items))
    print(f"ํ”„๋กœ์„ธ์Šค ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: {time.time() - start:.2f}์ดˆ")
    return results

# ๋น„๊ต ์‹คํ–‰
sequential_results = sequential_process()  # ์•ฝ 10์ดˆ
thread_results = parallel_process_threads()  # CPU ๋ฐ”์šด๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋” ๋น ๋ฆ„
process_results = parallel_process_processes()  # CPU ๋ฐ”์šด๋“œ ์ž‘์—…์— ์ ํ•ฉ

โœ… ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ํŠน์ง•:

  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…: ProcessPoolExecutor ์‚ฌ์šฉ
  • I/O ๋ฐ”์šด๋“œ ์ž‘์—…: ThreadPoolExecutor ์‚ฌ์šฉ
  • GIL(Global Interpreter Lock)๋กœ ์ธํ•œ ์ œ์•ฝ ๊ณ ๋ ค
  • ์ž‘์—…๋Ÿ‰์— ๋”ฐ๋ฅธ ์ ์ ˆํ•œ ์›Œ์ปค ์ˆ˜ ์„ค์ •
  • ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์„ฑ๋Šฅ ์ด์  ๊ท ํ˜• ๊ณ ๋ ค


๐Ÿ”Ÿ ์‹ค์šฉ์ ์ธ for ๋ฃจํ”„ ํŒจํ„ด

์‹ค์ „์—์„œ ์œ ์šฉํ•œ ๋‹ค์–‘ํ•œ for ๋ฃจํ”„ ํŒจํ„ด๊ณผ ๊ธฐ๋ฒ•์ด๋‹ค.

1. ์ฒญํฌ ๋‹จ์œ„ ์ฒ˜๋ฆฌ

def process_in_chunks(items, chunk_size=100):
    """๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒญํฌ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ"""
    for i in range(0, len(items), chunk_size):
        chunk = items[i:i + chunk_size]
        # ์ฒญํฌ ๋‹จ์œ„ ์ฒ˜๋ฆฌ
        process_chunk(chunk)
        print(f"์ฒญํฌ {i//chunk_size + 1} ์ฒ˜๋ฆฌ ์™„๋ฃŒ ({len(chunk)} ํ•ญ๋ชฉ)")

2. ์กฐ๊ธฐ ์ข…๋ฃŒ ํŒจํ„ด

def find_first_match(items, condition):
    """์กฐ๊ฑด์— ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ ์ฐพ๊ธฐ"""
    for item in items:
        if condition(item):
            return item
    return None

# ์‚ฌ์šฉ ์˜ˆ์‹œ
first_even = find_first_match(range(1, 100), lambda x: x % 2 == 0 and x > 10)

3. ์œˆ๋„์šฐ ์Šฌ๋ผ์ด๋”ฉ

def sliding_window(items, window_size):
    """์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ํŒจํ„ด์œผ๋กœ ํ•ญ๋ชฉ ์ฒ˜๋ฆฌ"""
    for i in range(len(items) - window_size + 1):
        yield items[i:i + window_size]

# ์‚ฌ์šฉ ์˜ˆ์‹œ
text = "ABCDEFGHIJ"
for window in sliding_window(text, 3):
    print(window)  # "ABC", "BCD", "CDE", ...

4. ์ƒํƒœ ์ถ”์  ๋ฐ˜๋ณต

def track_state_changes(items):
    """ํ•ญ๋ชฉ ์ƒํƒœ ๋ณ€ํ™” ์ถ”์ """
    if not items:
        return []
    
    changes = []
    previous = items[0]
    
    for current in items[1:]:
        if current != previous:
            changes.append((previous, current))
            previous = current
    
    return changes

# ์‚ฌ์šฉ ์˜ˆ์‹œ
temps = [22, 22, 23, 23, 23, 24, 25, 25, 24, 24]
print(track_state_changes(temps))  # [(22, 23), (23, 24), (24, 25), (25, 24)]

5. ์ค‘์ฒฉ ๋ฃจํ”„ ์ตœ์ ํ™”

# ๋น„ํšจ์œจ์ ์ธ ์ค‘์ฒฉ ๋ฃจํ”„
def find_pairs_naive(items1, items2, target_sum):
    """ํ•ฉ์ด target_sum์ธ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ํ•ญ๋ชฉ ์Œ ์ฐพ๊ธฐ (O(nยฒ))"""
    pairs = []
    for x in items1:
        for y in items2:
            if x + y == target_sum:
                pairs.append((x, y))
    return pairs

# ์ตœ์ ํ™”๋œ ๋ฐฉ๋ฒ•
def find_pairs_optimized(items1, items2, target_sum):
    """ํ•ฉ์ด target_sum์ธ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ํ•ญ๋ชฉ ์Œ ์ฐพ๊ธฐ (O(n))"""
    complements = set(target_sum - x for x in items1)
    return [(target_sum - y, y) for y in items2 if y in complements]

โœ… ์‹ค์šฉ ํŒจํ„ด ์žฅ์ :

  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ํšจ์œจ์  ์ฒ˜๋ฆฌ
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™”
  • ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
  • ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด ํ‘œ์ค€ํ™”
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก๋„ ๊ฐœ์„ 


โš ๏ธ **GitHub.com Fallback** โš ๏ธ