https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

해당 문제는 간단해 보였지만 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문 하라는 조건 때문에 응근히 까다롭게 느껴졌다.

 

n, m, v = map(int, input().split())
graph1 = {}
visited = list()
visited_dfs = list()
need_visited = list()
need_visited.append(v)
need_visited_dfs = list()
need_visited_dfs.append(v)

for _ in range(m):
    key, value = map(int, input().split())
    if key in graph1:
        graph1[key].append(value)
    else:
        graph1[key] = [value]

while need_visited:
    vertex = need_visited.pop(0)
    if vertex not in visited:
        visited.append(vertex)
        if vertex in graph1:
            need_visited.extend(graph1[vertex])

while need_visited_dfs:
    vertex = need_visited_dfs.pop()
    if vertex not in visited_dfs:
        visited_dfs.append(vertex)
        if vertex in graph1:
            need_visited_dfs.extend(graph1[vertex])
print(visited)
print(visited_dfs)

위 코드가 처음에 작성한 코드였다. 정점 번호가 작은걸 우선 방문하라는 조건을 빼면 일반 DFS, BFS 기능은 나온 것 같다. 작은걸 우선 방문하라는 조건을 지키기 위해서는 DFS와 BFS의 정렬 순서가 역정렬이 되어야 조건을 충족시킬 수 있을 것으로 보인다. 

아래 코드가 답코드이다.

from collections import deque

def dfs(v):
    print(v, end= ' ')
    visited[v] = True
    for e in adj[v]:
        if not(visited[e]):
            dfs(e)
def bfs(v):
    q = deque([v])
    while q:
        v = q.popleft()
        if not(visited[v]):
            visited[v] = True
            print(v, end=' ')
            for e in adj[v]:
                if not visited[e]:
                    q.append(e)
    
n, m, v = map(int, input().split())
adj = [[] for _ in range(n+1)]

for _ in range(m):
    x, y = map(int, input().split())
    adj[x].append(y)
    adj[y].append(x)
for e in adj:
    e.sort()
    
visited = [False] * (n + 1)
dfs(v)
print()
visited = [False] * (n + 1)
bfs(v)

deque를 사용하는 이유는 그냥 list를 사용하는거 보다 성능상 유리한 면이 있어서인 것 같다.

 

 

'알고리즘' 카테고리의 다른 글

BFS 1325번 효율적인 해킹  (0) 2021.12.01
백준 1012번 유기농 배추  (0) 2021.11.30
[JAVA]ArrayList 사용법  (0) 2021.11.23
1495번 기타리스트 백준  (0) 2021.11.21
병합정렬 & pypy3  (0) 2021.11.06
import java.util.ArrayList;

생성

ArrayList<Integer> arrayList1 = new ArrayList<Integer>();

추가

arrayList1.add(3);

삭제

arrayList1.remove(0);

 

'알고리즘' 카테고리의 다른 글

백준 1012번 유기농 배추  (0) 2021.11.30
기본 DFS와 BFS  (0) 2021.11.24
1495번 기타리스트 백준  (0) 2021.11.21
병합정렬 & pypy3  (0) 2021.11.06
동적계획법 (DP: Dynamic Programming) Python  (0) 2021.11.04

https://www.acmicpc.net/problem/1495

 

1495번: 기타리스트

첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 50, 1 ≤ M ≤ 1,000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.

www.acmicpc.net

N, S, M = map(int,input().split())
vols = list(map(int,input().split()))
sounds = list()
sounds.append(-1)

def vol_control(now,volumns, start, M):
    if now !=N-1:
        if start + volumns[now] <= M:
            vol_control(now+1, volumns, start + volumns[now], M)
        if start - volumns[now] >= 0:
            vol_control(now+1, volumns, start - volumns[now],M)
    else:
        if start + volumns[now] <= M:
            sounds.append(start + volumns[now])
        if start - volumns[now] >= 0:
            sounds.append(start - volumns[now])

vol_control(0,vols,S,M)
print(max(sounds))

 

위 문제를 위와같은 공식으로 풀었지만 메모리 초과 오류가 난다.

 

n, s, m = map(int, input().split())
array = list(map(int, input().split()))

dp = [[0]*(m+1) for _ in range(n+1)]
dp[0][s] = 1

for i in range(1, n+1):
    for j in range(0, m+1):
        if dp[i-1][j] != 0:
            if j + array[i-1] <= m:
                dp[i][j+array[i-1]] = 1
            if j - array[i-1] >= 0:
                dp[i][j-array[i-1]] = 1
                
result = -1
for i in range(m, -1, -1):
    if dp[n][i] == 1:
        result = i
        break
print(result)

해서 아래 방식으로 해결하였다 약간 계수 정렬을 사용한 느낌의 코드이다.

'알고리즘' 카테고리의 다른 글

기본 DFS와 BFS  (0) 2021.11.24
[JAVA]ArrayList 사용법  (0) 2021.11.23
병합정렬 & pypy3  (0) 2021.11.06
동적계획법 (DP: Dynamic Programming) Python  (0) 2021.11.04
계수 정렬(Counting Sort) 알고리즘  (0) 2021.11.04

 

def mergeSort(array):
    if len(array) <= 1:
        return array
    left, right = list(), list()
    mid   = len(array) // 2
    left  = mergeSort(array[:mid])
    right = mergeSort(array[mid:])
    
    i, j, k = 0, 0, 0
    
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            array[k] = left[i]
            i +=1
        else :
            array[k] = right[j]
            j+=1
        k +=1
    if i == len(left):
        while j < len(right):
            array[k] = right[j]
            j += 1 
            k += 1
    if j == len(right):
        while i < len(left):
            array[k] = left[i]
            i +=1
            k +=1
    return array
    
n = int(input())
nList = []
for _ in range(n):
    nList.append(int(input()))
nList = mergeSort(nList)
for data in nList:
    print(data)

https://www.acmicpc.net/problem/2751

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

위 문제를 pypy3 을 활용해서 해결하면 되는데 python3은 해결되지않는다.

https://www.acmicpc.net/problem/2747

 

2747번: 피보나치 수

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net

data = int(input())
n_list = [0]*46

def fibo(data):
    n_list[0] = 0
    n_list[1] = 1
    if data == 0:
        return 0
    if data == 1:
        return 1
    for i in range(2,len(n_list)):
        n_list[i] = n_list[i-1]+n_list[i-2]
        if i == data:
            return n_list[data]
print(fibo(data))

 

https://www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

import sys

n = int(sys.stdin.readline())
array = [0]*10001

for i in range(n):
    data = int(sys.stdin.readline())
    array[data] += 1
    
for i in range(10001):
    if array[i] != 0:
        for j in range(array[i]):
            print(i)

import sys를 사용해서 그런지 런타임 에러가 발생한다.

https://www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

testCase = int(input())
cus_info = list()

for _ in range(testCase):
    age, name = input().split()
    cus_info.append([int(age), name])
cus_info = sorted(cus_info, key = lambda x:x[0])
for cus in cus_info:
    print(cus[0], cus[1])

위 코드는 sorted 함수에 인자 값으로 key = lambda x:x[0] 을 매개변수로 주어 2개의 원소중 나의 값만으로 정렬 되게 한 것이 핵심 포인트이다.

https://programmers.co.kr/learn/courses/30/lessons/42746?language=python3 

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

from itertools import permutations

def solution(numbers):
    
    numbers = list(map(str,numbers))
    strs = []
    permus = list(permutations(numbers,len(numbers)))

    for permu in permus:
        str1 = ''
        str1 = str1.join(permu)
        strs.append(str1)
            
    return max(strs)

위 코드는 기능은 잘 되는 것 같지만 시간 초과로 아쉽게 코딩 테스트를 통과할 수 없었다. 하지만 permutations 라이브러리를 익힐 수 있는 좋은 예제 코드로 탄생한 것 같아 기록에 남긴다. 

i번 숫자부터 j번째 숫짜까지 자르려고 한다면 아래와 같은 방법으로 사용할 수 있다.

Arrays.copyOfRange(배열, i-1, j)

 

그리고 자른 배열을 사용하기위해 아래와 같이 사용한다.

int[] arr1 = Arrays.copyOfRange(배열,i-1, j)

 

정렬에 필요한 라이브러리 임포트

import java.util.Arrays;

정렬

Arrays.sort(arr);

정렬은 String도 가능해보이며 결과로 봤을때 알파벳 순으로 정렬하는 것 같다.

 

역정렬

Arrays.sort(arr,Collections.reverseOrder());

 

'알고리즘' 카테고리의 다른 글

프로그래머스 가장 큰 수[파이썬]  (0) 2021.11.01
자바 배열 자르기 copyOfRange()  (0) 2021.10.29
[java -heap]PriorityQueue 최소값 반환  (0) 2021.10.28
더 맵게[python3]  (0) 2021.10.27
python - heapq 힙  (0) 2021.10.27

+ Recent posts