Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

31-xxubin04 #116

Merged
merged 1 commit into from
Mar 1, 2024
Merged

31-xxubin04 #116

merged 1 commit into from
Mar 1, 2024

Conversation

xxubin04
Copy link
Member

@xxubin04 xxubin04 commented Feb 26, 2024

πŸ”— 문제 링크

134: Gas Station


βœ”οΈ μ†Œμš”λœ μ‹œκ°„

1μ‹œκ°„ + Ξ±


✨ μˆ˜λ„ μ½”λ“œ

1. 문제 이해

image
image


μ£Όμ–΄μ§€λŠ” μ£Όμœ μ†Œλ₯Ό μ „λΆ€ μˆœνšŒν•  수 μžˆλŠ” μ‹œμž‘ μ£Όμœ μ†Œ 번호λ₯Ό λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€.
μ£Όμœ μ†Œ 번호 = 인덱슀 λ²ˆν˜ΈλΌλŠ” 것을 μ£Όμ˜ν•˜μž.


image
image

Ex1μ—μ„œμ˜ gas = [1, 2, 3, 4, 5], cost = [3, 4, 5, 1, 2]이닀.
(gas[i] = 각 μ£Όμœ μ†Œμ—μ„œ μ–»λŠ” κ°€μŠ€μ–‘, cost[i] = 각 μ£Όμœ μ†Œλ‘œ κ°€κΈ° μœ„ν•΄ μ“°λŠ” κ°€μŠ€μ–‘)

3번 μ£Όμœ μ†Œ(인덱슀 = 3)μ—μ„œ μ‹œμž‘ν•΄λ³΄μž.
탱크에 κ°€μŠ€λ₯Ό μ €μž₯ν•œλ‹€κ³  치기 μœ„ν•΄ λ³€μˆ˜ tankλ₯Ό λ§Œλ“€μž. 그리고 νƒ±ν¬λŠ” μ²˜μŒμ— λΉ„μ–΄μžˆκΈ°μ— tank = 0으둜 지정해쀀닀.

  • gas = 4, cost = 1, index = 3
    • 3번 μ£Όμœ μ†Œ -> tank += 4 (4) -> 4번 μ£Όμœ μ†Œλ‘œ κ°€κΈ° -> tank -= 1 (3)
  • gas = 5, cost = 2, index = 4
    • 4번 μ£Όμœ μ†Œ -> tank += 5 (8) -> 0번 μ£Όμœ μ†Œλ‘œ κ°€κΈ° -> tank -= 2 (6)
  • gas = 1, cost = 3, index = 0
    • 0번 μ£Όμœ μ†Œ -> tank += 1 (7) -> 1번 μ£Όμœ μ†Œλ‘œ κ°€κΈ° -> tank -= 3 (4)
  • gas = 2, cost = 4, index = 1
    • 1번 μ£Όμœ μ†Œ -> tank += 2 (6) -> 2번 μ£Όμœ μ†Œλ‘œ κ°€κΈ° -> tank -= 4 (2)
  • gas = 3, cost = 5, index = 2
    • 2번 μ£Όμœ μ†Œ -> tank += 3 (5) -> 3번 μ£Όμœ μ†Œλ‘œ κ°€κΈ° -> tank -= 5 (0)

κ°€μŠ€μ˜ 양은 항상 0보닀 ν¬κ±°λ‚˜ κ°™μ•„μ•Ό ν•œλ‹€. μŒμˆ˜κ°€ λœλ‹€λ©΄ λ‹€μŒ μ£Όμœ μ†Œλ‘œ 이동할 수 μ—†κΈ° λ•Œλ¬Έμ— λͺ¨λ“  μ£Όμœ μ†Œλ₯Ό μˆœνšŒν•΄μ„œ μ‹œμž‘ν–ˆλ˜ μ£Όμœ μ†Œλ‘œ λŒμ•„μ˜¬ 수 μ—†λ‹€.


2. μ‹œκ°„μ΄ˆκ³ΌπŸ˜Š

image

λ‹€μŒμ€ 40개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μ€‘μ—μ„œ 33κ°œκΉŒμ§€λ§Œ ν†΅κ³Όν•œ μ½”λ“œλ“€μ΄λ‹€.

μ‹œκ°„μ΄ˆκ³Ό1
class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        original_gas, original_cost = gas, cost
        start = []
        # idx = [r for r in range(len(gas))]
        cnt = -1
        for g, c in zip(gas, cost):
            cnt += 1
            if g-c >= 0: start.append(cnt)
        for j in start:
            tank = 0
            cnt = 0
            gas = original_gas[cnt:] + original_gas[:cnt]
            cost = original_cost[cnt:] + original_cost[:cnt]
            for g, c in zip(gas, cost):
                tank = tank + g - c
                cnt += 1
                if tank < 0: break
            if tank >= 0: 
                return cnt
        return -1
μ‹œκ°„μ΄ˆκ³Ό2
class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        original_gas, original_cost = gas, cost
        start = []
        idx = [r for r in range(len(gas))]
        for i, g, c in zip(idx, gas, cost):
            if g-c >= 0: 
                tank = 0
                gas = original_gas[i:] + original_gas[:i]
                cost = original_cost[i:] + original_cost[:i]
                cal = []
                for g, c in zip(gas, cost):
                    cal.append(g-c)
                ans = 0
                check = True
                for a in range(len(cal)):
                    ans += cal[a]
                    if ans < 0: check = False
                if check == True: return i
        return -1
μ‹œκ°„μ΄ˆκ³Ό3
class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        original_gas, original_cost = gas, cost
        start = []
        cnt = -1
        for g, c in zip(gas, cost):
            cnt += 1
            if g-c >= 0: 
                tank = 0
                gas = original_gas[cnt:] + original_gas[:cnt]
                cost = original_cost[cnt:] + original_cost[:cnt]
                cal = []
                for g, c in zip(gas, cost):
                    cal.append(g-c)
                ans = 0
                check = True
                for a in range(len(cal)):
                    ans += cal[a]
                    if ans < 0: check = False
                if check == True: return cnt
        return -1

3. μ½”λ“œ 뢄석

사싀, 계속 κ³ μΉ˜λ‹€κ°€ μ‹œκ°„μ΄ˆκ³Ό μ΄μŠˆκ°€ ν•΄κ²°λ˜μ§€ μ•Šμ•„μ„œ 34개 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§Œ ν†΅κ³Όν•œ μ½”λ“œλ₯Ό 올리게 λ˜μ—ˆλ‹€...
λ‹€μ‹œ 풀어보고 λͺ¨λ“  ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό ν†΅κ³Όν•œλ‹€λ©΄ λ‹€μ‹œ μ˜¬λ €μ•Όκ² λ‹€..πŸ˜‚

class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        if sum(gas) < sum(cost):
            return -1
        for i in range(len(gas)):
            tank = 0
            for g, c in zip(gas[i:]+gas[:i], cost[i:]+cost[:i]):
                tank = tank + g -c
                if tank < 0: break
            if tank >= 0: return i
        return -1

μœ„μ˜ 계산과정 사진과 풀이λ₯Ό 참고해보면, λ‹€μŒκ³Ό κ°™λ‹€.

tank = (4-1) + (5-2) + (1-3) + (2-4) + (3-5) 

그리고 μš°λ¦¬λŠ” 1. κ°€μŠ€ μΆ©μ „(+)κ³Ό 2. κ°€μŠ€ μ‚¬μš©(-)λ₯Ό 거친 μƒνƒœμ˜ κ°€μŠ€ μƒνƒœκ°€ 음수이면 μ•ˆλœλ‹€. 즉, κ΄„ν˜Έλ‘œ λ¬ΆλŠ” 뢀뢄이 ν•œ μ£Όμœ μ†Œμ—μ„œ κ±°μΉ˜λŠ” κ³Όμ •(nμ£Όμœ μ†Œμ—μ„œ κ°€μŠ€μ–»κ³ , λ‹€μŒ μ£Όμœ μ†Œ κ°€κΈ°μœ„ν•΄ κ°€μŠ€μ‚¬μš©)μ΄λ―€λ‘œ 이 κ΄„ν˜Έμ˜ 계산이 μŒμˆ˜κ°€ 되면, λ‹€μŒ μ£Όμœ μ†Œλ‘œ κ°€λŠ” κ³Όμ •μ—μ„œ κ°€μŠ€ λΆ€μ‘±μœΌλ‘œ 갈 수 μ—†κ²Œ λ˜λŠ” κ²½μš°μ΄λ‹€.

μœ„μ˜ tank 식은 sum(gas) - sum(cost)κ³Ό κ°™λ‹€. ((4+5+1+2+3) - (1+2+3+4+5))
κ·ΈλŸ¬λ―€λ‘œ, sum(gas) < sum(cost) == tank < 0μ΄λ―€λ‘œ 이 κ²½μš°μ—λŠ” -1을 λ°˜ν™˜ν•΄μ€€λ‹€.

for문으둜 λͺ¨λ“  μ£Όμœ μ†Œλ₯Ό μˆœνšŒκ°€λŠ₯ν•œ κ²½μš°κ°€ λ‚˜μ˜¬λ•ŒκΉŒμ§€ 확인해쀀닀.
계산 κ³Όμ •μ—μ„œ tankκ°€ μŒμˆ˜κ°€ λ˜λŠ” κ²½μš°κ°€ 생긴닀면, μ¦‰μ‹œ breakν•˜κ³  λ‹€μŒ μ£Όμœ μ†Œλ₯Ό μ‹œμž‘μ μœΌλ‘œ μž‘μ€ 경우λ₯Ό 확인해쀀닀.
λ§Œμ•½, λͺ¨λ“  μ£Όμœ μ†Œλ₯Ό ν™•μΈν•˜κ³  tank >= 0이라면 μΈλ±μŠ€μ΄λ©΄μ„œ μ£Όμœ μ†Œμ˜ 번호인 iλ₯Ό λ°˜ν™˜ν•œλ‹€.


4. 전체 μ½”λ“œ

class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        if sum(gas) < sum(cost):
            return -1
        for i in range(len(gas)):
            tank = 0
            for g, c in zip(gas[i:]+gas[:i], cost[i:]+cost[:i]):
                tank = tank + g -c
                if tank < 0: break
            if tank >= 0: return i
        return -1

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

λ‹€ ν•΄κ²°ν•˜κ³  PR μ˜¬λ Έμ–΄μ•Ό ν•˜λŠ”λ° 12μ‹œκ°€ λ„˜μ–΄μ„œ μ˜¬λ¦½λ‹ˆλ‹€πŸ˜­
μ‹œκ°„μ΄ˆκ³Ό... νž˜λ“œλ„€μš”πŸ₯² 풀이λ₯Ό μ œλŒ€λ‘œ 썼을지 λͺ¨λ₯΄κ² λ„€μš”..
문제 ν’€λ•Œλ§ˆλ‹€ 항상 많이 λΆ€μ‘±ν•œ 것을 느끼고 κ°‘λ‹ˆλ‹€..

Copy link
Collaborator

@9kyo-hwang 9kyo-hwang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1. 졜초 μ½”λ“œ

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        for i, (g, c) in enumerate(zip(gas, cost)):
            if g < c:  # ν˜„μž¬ μ§€μ μ—μ„œ μΆœλ°œν•  수 μ—†λŠ” 경우
                continue

            tank = 0
            for _ in range(len(gas)):  # μ§€κΈˆ μ§€μ μ—μ„œ μΆœλ°œν•΄λ΄„
                tank += gas[i] - cost[i]
                if tank < 0:  # λΉ„μš©μ΄ 더 크면 더 λͺ»κ°€λ―€λ‘œ stop
                    break
                i = (i + 1) % len(gas)  # 인덱슀 μ‘°μ •(0λΆ€ν„° μ‹œμž‘μ΄ μ•„λ‹ˆκΈ° λ•Œλ¬Έ)
            
            if tank >= 0:  # λκΉŒμ§€ λŒμ•˜λŠ”λ°λ„ μž”μ—¬ μ—°λ£Œκ°€ μžˆλ‹€λ©΄ μ™„μ£Ό 성곡
                return i

        return -1  # λͺ¨λ“  κ²½μš°μ— λŒ€ν•΄ return iλ₯Ό μ§„μž…ν•˜μ§€ λͺ»ν–ˆλ‹€λ©΄ λΆˆκ°€λŠ₯ν•œ μΌ€μ΄μŠ€

λ‚˜λ¦„ 합리적인 μ½”λ“œλΌ μƒκ°λμ§€λ§Œ...
image

였 γ…‹γ…‹ λΉ κΎΈμ—†λŠ” λ°˜λ‘€μ— κ±Έλ €λ²„λ ΈμŠ΅λ‹ˆλ‹€. $O(n^2)$이 λ˜λ©΄μ„œ λƒ…λ‹€ μ‹œκ°„ ν„°μ Έλ²„λ Έλ”λΌκ΅¬μš”.

2. κ°œμ„ λœ μ½”λ“œ

μ–΄λ–€ A μ§€μ μ—μ„œ B μ§€μ μœΌλ‘œ κ°„λ‹€κ³  ν•  λ•Œ, 쀑간에 μ–Όλ§ˆλ‚˜ μ—°λ£Œκ°€ λ„˜μΉ˜κ²Œ μΆ©μ „ν–ˆλ“  λ§ˆμ§€λ§‰ ν•˜λ‚˜μ—μ„œ μ—°λ£Œ λ‹€ κΉŽμ•„λ¨Ήμ–΄μ„œ λͺ»κ°€κ²Œ 되면 A와 B 사이(A 포함)에 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  지점 은 μΆœλ°œν•  수 μžˆλŠ” 지점이 μ•„λ‹ˆκ²Œ λ©λ‹ˆλ‹€.
κ·Έλ ‡λ‹€λ©΄, ꡳ이 λͺ»κ°€λŠ” 사이 지점을 탐색할 ν•„μš” 없이 λ°”λ‘œ κ±΄λ„ˆλ›°λ©΄ 되겠죠?

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        if sum(gas) < sum(cost):
            return -1
        
        start = 0
        while start < len(gas):
            tank = 0
            for i in range(len(gas)):
                i = (i + start) % len(gas)
                tank += (gas[i] - cost[i])
                if tank < 0:
                    start = i + 1
                    break
            
            if tank >= 0:
                return start

        return -1
image

톡과 따이~

3. 순회 ν•œ 번으둜 λλ‚΄λŠ” μ½”λ“œ...?

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        if sum(gas) < sum(cost):
            return -1

        start, tank = 0, 0
        for i, (g, c) in enumerate(zip(gas, cost)):
            tank += (g - c)

            if tank < 0:
                tank = 0
                start = i + 1

        return start

gas 총 κ³΅κΈ‰λŸ‰μ΄ cost 총 μ†Œλͺ¨λŸ‰λ³΄λ‹€ λ§Žλ‹€λ©΄, λ°˜λ“œμ‹œ ν•œ 바퀴λ₯Ό 돌 수 μžˆλŠ” 지점이 μžˆλ‹€λŠ” 뜻이 λ©λ‹ˆλ‹€.
κ·Έκ±°λ₯Ό λ”± ν•œ 번만 μˆœνšŒν•΄μ„œ ν•΄κ²°ν•˜λŠ” μ½”λ“œμΈλ°... 저도 κΌΌκΌΌν•˜κ²Œ 따져보지 μ•Šμ•„μ„œ λͺ…ν™•ν•˜κ²Œ μ„€λͺ…이 잘 μ•ˆλ˜λ„€μš”... ν•œ 번 μ•Œμ•„λ³΄μ‹€λž˜μš”? 😈

@xxubin04
Copy link
Member Author

xxubin04 commented Feb 28, 2024

순회 ν•œλ²ˆμœΌλ‘œλ„ ν’€ 수 μžˆμ—ˆκ΅°μš”!!
μƒκ°ν•΄λ³΄λ‹ˆ ꡳ이 gas[j:] + gas[:j] μ΄λŸ°μ‹μœΌλ‘œ λ‹€μ‹œ nλΆ€ν„° n-1κΉŒμ§€ ν•œ 바퀴λ₯Ό 확인해 쀄 ν•„μš”κ°€ μ—†λ„€μš”.

for i in range(len(gas)):
# index(μ£Όμœ μ†Œ 번호) : 0 1 2 3 ... m ... n

μœ„μ™€ κ°™λ‹€λ©΄ λ§Œμ•½ m ( 0 < m < n)(start = m)μ—μ„œ ν•œ 바퀴 μˆœνšŒκ°€ κ°€λŠ₯ν•˜λ‹€κ³  쳀을 λ•Œ, 인덱슀 0λΆ€ν„° m-1μ£Όμœ μ†Œμ—μ„œ tank < 0이 μ•„λ‹ˆμ—ˆλ‹€λŠ” κ²ƒμ΄λ―€λ‘œ forλ¬Έ μˆœνšŒκ°€ λλ‚˜κ³  λ‚˜μ„œ λ§ˆμ§€λ§‰μœΌλ‘œ 정해진 startλ₯Ό λ°˜ν™˜ν•˜λ©΄ λ˜λŠ”κ±°μ˜€λ„€μš”!

κ°‘μžκΈ° 'μ‹œμž‘ν•˜λŠ” μ£Όμœ μ†Œμ— 따라 각 μ£Όμœ μ†Œλ₯Ό κ±°μΉ˜λŠ” κ³Όμ •μ—μ„œ tank 값이 λ‹¬λΌμ§ˆ μˆ˜λ„ μžˆμ§€ μ•Šλ‚˜?'λΌλŠ” 의문이 μƒκ²ΌλŠ”λ° 이것도 문제 μ—†λ”λΌκ΅¬μš”.

  1. 0 ~ m-1μ—μ„œμ˜ μ£Όμœ μ†Œμ—μ„œ μ‹œμž‘ν–ˆμ„ λ•ŒλŠ” tank < 0인 μˆœκ°„μ΄ 단 ν•œλ²ˆμ΄λΌλ„ μƒκΈ΄λ‹€λŠ” 것
  2. μ–΄λ””μ„œλΆ€ν„° μ‹œμž‘ν•˜λ˜μ§€ μ‹œμž‘ μ£Όμœ μ†Œμ˜ λ°”λ‘œ μ•ž tankκ°€ μŒμˆ˜μ§€λ§Œ, forλ¬Έ μˆœνšŒν•˜λŠ” λ™μ•ˆ 정해진 startλŠ” for문이 λλ‚ λ•ŒκΉŒμ§€ tank < 0인 μˆœκ°„μ΄ 단 ν•œλ²ˆλ„ μ—†λŠ” 것
  3. μ£Όμœ μ†Œλ₯Ό ν•œ 바퀴 무쑰건 순회 κ°€λŠ₯ν•˜λ©° μœ μΌν•¨(ν•˜λ‚˜μ˜ μ‹œμž‘μ μ—μ„œλ§Œ κ°€λŠ₯)

μ΄λ―€λ‘œ λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

μ‹ κΈ°ν•˜λ„€μš”... κ°μ‚¬ν•©λ‹ˆλ‹€!πŸ‘

Copy link
Collaborator

@Dolchae Dolchae left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아이고 μ‹œκ°„μ΄ˆκ³Ό...πŸ˜‚πŸ˜‚ μ—„μ²­ 많이 λ‹€μ‹œ λ„μ „ν•΄λ³΄μ…¨λ„€μš”..πŸ‘πŸ‘ μˆ˜κ³ λ§ŽμœΌμ‹­λ‹ˆλ‹€πŸ”₯😊

Copy link
Member

@gjsk132 gjsk132 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ²˜μŒμ— ν’€μ—ˆμ„ λ•ŒλŠ” 리슀트둜 κ²°κ³Όλ₯Ό λ‹€ μ €μž₯ν•˜λ‹ˆ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€κ³  μ‹œκ°„μ΄ μ˜€λž˜κ±Έλ¦¬λŠ” λ¬Έμ œκ°€ μƒκ²¨μ„œ λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ λ°”κΏ”μ€¬μŠ΅λ‹ˆλ‹€!

gas와 cost의 κ°’μ˜ μ°¨λ₯Ό λ‚˜μ—΄ν–ˆμ„ λ•Œ, λ³Ό 수 μžˆλŠ” 2가지 κ·œμΉ™μ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

  1. 같은 λΆ€ν˜Έκ°€ μ—°μ†μœΌλ‘œ 있으면 κ²ΉμΉ  수 μžˆλ‹€.
  2. λ‹€λ₯Έ λΆ€ν˜Έκ°€ μ΄μ–΄μ Έμžˆλ‹€λ©΄
    a. 두 개의 합이 μ–‘μˆ˜μΈ 경우 맨 μ•žμ— κ·ΈλŒ€λ‘œ 두고
    b. 두 개의 합이 음수라면 ν•΄λ‹Ή μœ„μΉ˜λ³΄λ‹€ λ’€μ—μ„œ μ‹œμž‘ν•΄μ•Όν•΄μ„œ λ”°λ‘œ λΉΌλ’€λ‹€κ°€ λ§ˆμ§€λ§‰ κ°’μ˜ 결과와 비ꡐ해주면 λ©λ‹ˆλ‹€.
    ( -μ—μ„œ + λ„˜μ–΄κ°€λƒ +μ—μ„œ - λ„˜μ–΄κ°€λƒμ— 따라 κΈ°μ–΅ν•΄μ•Όν•˜λŠ” μ‹œμž‘ 지점이 달라진닀. )

이런 νŠΉμ§•μ„ μ‚¬μš©ν•œλ‹€λ©΄, λͺ¨λ“  지점을 리슀트둜 κΈ°μ–΅ν•˜κ±°λ‚˜, μ—¬λŸ¬ 번 λ°˜λ³΅μ„ 해주지 μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

μ½”λ“œ
class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:

        pos = 0
        total = 0
        minus = 0

        for i in range(len(gas)):
            if (tmp := gas[i] - cost[i]) == 0:
                continue

            elif total * tmp >= 0:
                total += tmp

                if tmp < 0:
                    pos = i + 1

                continue

            if (n := tmp + total) < 0:
                minus += n
                total = 0
                pos = i if tmp > 0 else i + 1
            else:
                total = n

        return pos if total + minus >= 0 else -1

λ­”κ°€ μ½”λ“œκ°€ λ³΅μž‘ν•œλ° 더 짧게 쀄이렀닀가 ν•œμ°Έ λΆ™μž‘κ³  μžˆμ—ˆλ„€μš”...

κ·Έλž˜λ„ λ‚˜λ¦„ μ„±κ³΅μ μœΌλ‘œ μ •λ¦¬λμŠ΅λ‹ˆλ‹€! :)
image

@xxubin04 xxubin04 merged commit f421750 into AlgoLeadMe:main Mar 1, 2024
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants