www.acmicpc.net/problem/1168

 

1168번: 요세푸스 문제 2

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 100,000)

www.acmicpc.net

1158번 요세푸스 문제와 달리 세그먼트 트리를 구현해야만 통과가 가능하다.

푸는데는 성공했지만 내 역량 밖이라 더 공부하고 다시 풀어야 할 것 같다.

코드는 내가 완전히 익히면 공개해야겠다.

 

아래는 문제풀 때 참고했던 글들 >>>

1. 세그먼트 트리 정리

www.crocus.co.kr/648

 

세그먼트 트리(Segment Tree)

세그먼트 트리(Segment Tree)는 요청하는 쿼리에 대해 방식이 달라질 수 있으나, 모든 쿼리를 다룰 수 없기에 구간 합에 대한 세그먼트 트리를 정리해 두었습니다. 내용이 길지만 그만큼 자세히 설

www.crocus.co.kr

2. c++로 구현 한 분들

cocoon1787.tistory.com/433

 

[C/C++] 백준 1168번 - 요세푸스 문제 2 (세그먼트 트리)

<코드> #include #include using namespace std; int N, K; int a, b; int seg[(1< > N >> K; init(1, 1, N); // (루트노드, 시작, 끝) int index = 1; cout << "<"; for (int i = 0; i < N; i++) { // 다음 순서..

cocoon1787.tistory.com

suri78.tistory.com/274

 

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

[백준]1107번 리모컨 파이썬  (0) 2021.02.23
[백준] 1967번 트리의 지름 파이썬  (0) 2021.02.20

www.acmicpc.net/problem/1107

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼

www.acmicpc.net

리모컨을 부수고 싶었던 문제다ㅠ

 

풀이

  1. 완전 탐색
  2. +- 다 가능하므로 범위는 1000000까지
  3. 초기 값인 100에서 목표 값 까지 모든 버튼이 고장난 경우를 생각하여 최소 값을 목표 값 - 100으로 지정 해준다
  4. -> 이걸로 목표가 100일 때 예외 처리도 가능
주의점
- 고장난 리모컨이 없을 경우엔 고장난 버튼 입력을 받지 않아야 하므로 if문으로 예외 처리 해주기
import sys
input = sys.stdin.readline

num = int(input())
M = int(input())

array = [0 for _ in range(10)]
flag = True
if M != 0 :
    button = list(map(int, input().split()))
    for i in button:
        array[i] = 1

cnt = abs(num-100)

for i in range(1000001):
    list_i = list(str(i))
    flag = False
    for j in list_i:
        if array[int(j)]==0 : continue
        else:
            flag = True
            break

    if not flag:
        tmp = abs(num-i) + len(list_i)
        if cnt > tmp:
            cnt = tmp
print(cnt)

www.acmicpc.net/problem/1967

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net

 

 

1. 루트로부터 가중치를 구한다.

2. 가중치 값이 들어있는 result 배열에서 최대 값 찾기

3. 최대 값을 가진 노드로부터 각 노드까지의 거리(지름)을 구하여 result 배열에 넣는다.

4. 그 배열에서 가장 큰 값이 최장 지름!

 

 주의점
- 루트에서 루트, index에서 index일때는 0으로 초기화 시켜준다. 
import sys
from collections import deque
input = sys.stdin.readline
sys.setrecursionlimit(10 ** 9)

N = int(input())
graph = [[] for _ in range(N+1)]
result = [0 for _ in range(N+1)]

max = 0

for i in range(N-1):
    a,b,c = map(int, input().split())
    graph[a].append([b,c])
    graph[b].append([a,c])

def bfs(i, graph, result):
    q = deque()
    for j in range(len(graph[i])):
        q.append(graph[i][j])
    while q:
        a,b = q.popleft()
        if result[a] == 0:
            result[a] = result[i] + b
            bfs(a, graph, result)

bfs(1, graph, result)
result[1] = 0

index = 0
tmp_max = 0
for i in range(len(result)):
    if tmp_max < result[i]:
        tmp_max = result[i]
        index = i

result = [0 for _ in range(N+1)]
bfs(index, graph, result)
result[index] = 0

tmp_max = 0
for i in range(len(result)):
    if tmp_max < result[i]:
        tmp_max = result[i]

print(tmp_max)

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

[백준] 1168번 요세푸스 문제 2 파이썬  (0) 2021.03.23
[백준]1107번 리모컨 파이썬  (0) 2021.02.23

+ Recent posts