본문 바로가기

FOSCAR-(Autonomous Driving)/알고리즘 스터디

[2023 알고리즘 스터디] 1조 김예진 3주차 - 백준 25501, 17608, 2161, 17478

반응형

3주차 알고리즘 스터디

 

스택 & 큐

https://www.youtube.com/watch?v=7iLoLcna7Hw&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=16

 

재귀 함수

https://www.youtube.com/watch?v=gFpKGWdEE5g&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=17

 

그래프 탐색 알고리즘 : DFS/BFS

-탐색이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정
-대표적인 그래프 탐색 알고리즘으로 DFS와 BFS가 있음
-두 가지는 코딩 테스트에서 매우 자주 등장하는 유형이므로 반드시 숙지해야한다.

 

스택 자료구조

-저 들어 온 데이터가 나중에 나가는 형식(선입후출)의 자료구조
-입구와 출구가 동일한 형태로 스택을 시각화 가능

 

큐 자료구조

-먼저 들어 온 데이터가 먼저나가는 형식(선입선출)의 자료구조
-큐는 입구와 출구가 모두 뚫려 있는 터널과 같은 형태로 시각화 가능

 

재귀 함수

-재귀 함수란 자기 자신을 다시 호출하는 함수를 의미
-재귀 함수를 문제 풀이에서 사용할 때는 재귀 함수의 종료 조건을 반드시 명시해야 함.
-종료 조건을 제대로 명시하지 않으면 함수가 무한히 호출될 수 있음.


재귀 함수 사용의 유의 사항

-재귀 함수를 잘 활용하면 복잡한 알고리즘을 간결하게 작성할 수 있음.
(단, 오히려 다른 사람이 이해하기 어려운 형태의 코드가 될 수도 있으므로 신중하게 사용해야 함.)
-모든 재귀 함수는 반복문을 이용하여 동일한 기능을 구현할 수 있음.
-재귀 함수가 반복문보다 유리한 경우도 있고 불리한 경우도 있음.
-컴퓨터가 함수를 연속적으로 호출하면 컴퓨터 메모리 내부의 스택 프레임에 쌓임.
(그래서 스택을 사용해야 할 때 구현상 스택 라이브러리 대신에 재귀 함수를 이용하는 경우가 많음.)

 

 

# 25501 - 재귀의 귀재

25501번: 재귀의 귀재 (acmicpc.net)

 

25501번: 재귀의 귀재

각 테스트케이스마다, isPalindrome 함수의 반환값과 recursion 함수의 호출 횟수를 한 줄에 공백으로 구분하여 출력한다.

www.acmicpc.net

import sys
input = sys.stdin.readline

def recursion(s, l, r):
    global cnt
    cnt +=1
    if(l>=r):
        return 1
    elif(s[l] != s[r]):
        return 0
    else:
        return recursion(s, l+1, r-1)
def isPalindrome(s):
    return recursion(s, 0, len(s)-1)
T = int(input())
for _ in range(T):
    s = input().rstrip()
    cnt = 0
    a = isPalindrome(s)
    print(a, cnt)

 

 

 

 

# 17608 - 막대기

17608번: 막대기 (acmicpc.net)

 

17608번: 막대기

아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로

www.acmicpc.net

import sys

input = sys.stdin.readline

n = int(input())
stack = []

for _ in range(n):
   stack.append(int(input()))
   
last = stack[n - 1]
count = 1

for i in reversed(range(n)):
    if stack[i] > last:
       count += 1
       last = stack[i]
       
print(count)

 

 

 

 

# 2161 - 카드1

2161번: 카드1 (acmicpc.net)

 

2161번: 카드1

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

n = int(input())
card = list() #인덱스 필요
discard = list()

for i in range(1, n + 1):
    card.append(i)

while len(card) != 1:
    discard.append(card.pop(0)) 
    card.append(card.pop(0))

for i in range(n - 1):
    print(discard[i], end = ' ') #버려진 카드 먼저 한줄로 출력

print(card[0]) #마지막 남은 카드 출력

 

 

 

 

# 17478 - 재귀함수가 뭔가요?

17478번: 재귀함수가 뭔가요? (acmicpc.net)

 

17478번: 재귀함수가 뭔가요?

평소에 질문을 잘 받아주기로 유명한 중앙대학교의 JH 교수님은 학생들로부터 재귀함수가 무엇인지에 대하여 많은 질문을 받아왔다. 매번 질문을 잘 받아주셨던 JH 교수님이지만 그는 중앙대

www.acmicpc.net

#17478번 문제 같은 경우는 팀원 대부분이 어렵고 복잡하다고 느껴 다양한 코드를 공유하며 이야기를 나눠 보았습니다.

def e(n): # fn함수가 끝나고 나서 실행되는 재귀함수
    if n >= 0:
        print(("____"*(n))+"라고 답변하였지.")
        e(n-1) # 재귀 함수 실행
    else:
        return 0 # 재귀 함수 종료
def fn(n):
    if n > 0: # 0 초과일 경우
        print(("____"*(s-n))+"\"재귀함수가 뭔가요?\"")
        print(("____"*(s-n))+"\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.")
        print(("____"*(s-n))+"마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.")
        print(("____"*(s-n))+"그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"")
        return fn(n-1)  # 재귀 함수 실행
    else: # 0 이하일 경우
        print(("____"*(s-n))+"\"재귀함수가 뭔가요?\"")
        print(("____"*(s-n))+"\"재귀함수는 자기 자신을 호출하는 함수라네\"")
        e(s) # e 함수 실행
s = int(input()) # 재귀함수 실행 횟수 입력
print("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.")
fn(s)

 

반응형