알고리즘/SWAE

[Python] 5097. 회전, 5099. 피자 굽기, 5102. 노드의 거리, 5105 미로의 거리

황성안 2021. 3. 5. 16:36
728x90

5097. 회전

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys
sys.stdin = open("5097.txt""r")
 
= int(input())
for tc in range(1,T+1):
    N, M = list(map(int,input().split()))
    nlst = list(map(int,input().split()))
    cnt = 1
 
    while True:
        temp = nlst.pop(0)
        nlst.append(temp)
 
        cnt += 1
        if cnt == M:
            break
 
    print("#{} {}".format(tc, nlst[1]))
 
# ###
# for i in range(M):
#     data = lst.pop(0)
#     lst.append(data)
#
# print(lst.pop(0))
 
## 오우오우 만약 N개의 자연수를 M번을 나누면 된다. M%N
cs

5099. 피자 굽기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import sys
sys.stdin = open("5099.txt""r")
 
= int(input())
for tc in range(1,T+1):
    #M개의 피자, 뿌려진 치즈 양, 화덕을 한바퀴 돌때 녹지 않은 치즈의 양은 반으로 줄어듬 //2
    # 치즈 모두 녹아 0이면 화덕에서 꺼낸다.
    # 다시 그자리에 남은 피자 순서대로 넣기
 
    N, M = list(map(int, input().split()))
    cheeze = list(map(int,input().split()))
    Q = []  # 화덕?
 
    for i in range(N):
        Q.append([cheeze[i], i])
    #print(cheeze)
    #print(Q)
 
    i = 0
    while len(Q) != 1:
        Q[0][0= Q[0][0]//2    #치즈 녹이기
 
        if Q[0][0== 0:        #만약에 치즈 다녹이면?
            if N+i< M:
                Q.pop(0)
                Q.append([cheeze[N+i],N+i])
                i+=1
            elif N+>= M:
                Q.pop(0)
        else:
            Q.append(Q.pop(0))
 
    print("#{} {}".format(tc, Q[0][1]+1))
 
#     while Q: #화덕 Q
#         for i in range(len(Q)):#한바퀴 돌때
#             cheeze[i] = cheeze[i]//2
#
#     if 치즈가 모두 녹아내렸다면,화덕에 피자가 빠지면
#         temp = cheeze.pop(0)
#         Q.append(temp)
#
#     print(hwa)
#
# 화덕 크기
 
cs

5102. 노드의 거리

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import sys
sys.stdin = open("5102.txt""r")
 
def BFS(Q):
    d = 1
    while Q:
        s_Q=[]
        while Q: #
            idx = Q.pop()
            for i in linelst[idx]: #연결 확인
                if visited[i]: #만약에 방문했다면 넘어감
                    continue
                if i== end:     #도착했다면 cnt로 체크한 거리 반환
                    return d
                s_Q.append(i) #두번째 큐로 가버리기
                visited[i] = 1 #그리고 방문처리도!
        d += 1 #큐가 비었으면 거리 증가
        Q = s_Q
    return  0
 
= int(input())
for tc in range(1,T+1):
    #V : 노드, E : 간선
    V, E = map(int, input().split())
    #간선 표시
    linelst = [[] for _ in range(V+1)]
    #방문 표시
    visited = [[] for _ in range(V+1) ]
 
    for i in range(E):
        a, b = map(int, input().split())
        linelst[a].append(b)
        linelst[b].append(a)
 
    #시작 노드와 끝나는 노드 저장
    start, end = map(int, input().split())
    #시작했던 곳 표시
    visited[start] = 1
    #bfs 돌리기
    print("#{} {}".format(tc, BFS([start])))
 
cs

5105 미로의 거리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import sys
sys.stdin = open("5105.txt""r")
#=======================================================================================================================
#안되나봄
# def startpoint():
#     for y in range(N):
#         for x in range(N):
#             if Miro[y][x] == 2:
#                 sy, sx = y, x
#     return sy,sx
#=======================================================================================================================
def possible(y,x): #이동 가능한 곳인지 조건문에 활용하기
    return 0 <= y < N and 0<= x < N and (Miro[y][x] == 0 or Miro[y][x] == 3)
#=======================================================================================================================
def BFS(sy, sx):
    global D_result                 #거리
    Q.append((sy, sx))
    visited.append((sy, sx))    #갔던곳 표시
 
    while Q: # q가 남아있을때까지
        sy, sx = Q.pop(0)
        for dir in range(4):            #4방향 탐색
            NewY = sy + dy[dir]
            NewX = sx + dx[dir]
            if possible(NewY, NewX) and (NewY, NewX) not in visited:    #possible 확인 후 방문하지 않았던 곳인지? 조건문 실행
                Q.append((NewY, NewX))                              # Q에 내가 간 장소 append 해주기
                visited.append((NewY, NewX))                        #visited에 내가 갈수있는 새로운 xy 좌표를 append 해준다.
                Distance[NewY][NewX] = Distance[sy][sx]+  1        #지나간 거리마다 +1 해주기
                if Miro[NewY][NewX] == 3:                           #도착지인 3에 왔다면?
                    D_result = Distance[NewY][NewX] -1              #거리 값은 계산했던 거리값 -1 해서 결과 값 저장
                    return
#=======================================================================================================================
 
= int(input())
for tc in range(1, T+1):
    N = int(input())
    Miro = [list(map(int, input())) for _ in range(N)]
    visited = [[0]*for _ in range(N)]
 
    for y in range(N):
        for x in range(N):
            if Miro[y][x] == 2:
                sy, sx = y, x
    dy = [1-100]
    dx = [00-11]
 
    D_result = 0
    Q = []
    Distance = [[0]*for _ in range(N)]
    BFS(sy, sx)
    # for i in range(N):
    #     print()
    #     for j in range(N):
    #         print(Distance[i][j],end="")
    # print()
    # print()
    print("#{} {}".format(tc, D_result))
 
###########선생님"
# def dfs():
#     while ST:
#         #튜플인 경우에는 () 괄호 안쓰고 row col 적어도됨
#         row,col = ST.pop(-1)
#         #4방면
#         for di in range(4):
#             #경계 체크
#             newR =
#             newC =
#             if 경계 체크 and arr[newR][newC] != '1' and not visited[newR][newC]:
#                 ST.append((newR, newC))# 왜 () 추가시켜주지?
#                 visited[][] =
#                 #여기 까지 몇번왔는디 체크하는 방법
# def Bfs(row,col):
#     Q.append((row,col,0))
#
#     while Q:
#         row,col,cnt = Q.pop(0)
#         #원래 0 부터 들어와서 체크해주기위해 1부터시작
#         visited[row][col]
#         for di in range(4):
#             newR =
#             newC =
#
#             if 경계 체크 and arr[newR][newC] != '1' and not visited[newR][newC] == 0:
#                 if arr[newR][newC] =='3':
#                     return cnt
#
#                 ST.append((newR,newC)) # vistied를 쓰면 cnt 를 사용할 필요가없다.
#                 visited[newR][newC] = visited[row][col] + 1
cs
728x90