파이썬 146

[백준-파이썬] 2206: 벽 부수고 이동하기

문제 보러 가기~~ 아이디어 ✨ BFS인데 3차원 리스트를 활용해야 한다. 문제에서 3차원 리스트 쓰는 건 처음 해봤다 !! 일반적인 최단 거리 찾기에서 벽을 최대 한번 부술 수 있다는 조건이 추가되었다. 그래서 벽을 부수었는지 여부에 따라서 다른 2차원 리스트로 방문 체크를 해줬다. (즉 3차원 리스트를 만듦) 큐에 해당 인덱스, 벽을 부수었는지, 출발점부터 해당 위치까지의 거리를 넣어줬다. 큐 안에 요소가 있을 때, 하나씩 꺼내보면서 도착이면 그걸 따로 저장해줬고 그게 아니라면 4면을 돌아보면서 범위 이내인지 체크한다. 방문을 하지 않았고 벽인데, 아직 한번도 벽을 부수지 않았다면 벽을 부수고 거기로 간다. 방문을 하지 않았고 길이면, 벽을 부수지 않고 거기로 간다. '거기로 간다'라는..

[백준-파이썬] 1991: 트리 순회

문제 보러 가기! 트리 순회를 구현하는 문제! 숫자가 아니라 알파벳으로 들어와서, 그걸 숫자로 바꿔주는 것만 신경쓰면 될 것 같다! N = int(input()) # 노드의 개수 tree = list([0] * 2 for _ in range(N + 1)) # 왼쪽 자식, 오른쪽 자식 def pre_order(node): # 전위 순회 if node: print(chr(node+64), end='') # 할 일 pre_order(tree[node][0]) # 왼쪽 자식 pre_order(tree[node][1]) # 오른쪽 자식 def mid_order(node): # 중위 순회 if node: mid_order(tree[node][0]) # 왼쪽 자식 print(chr(node+64), end='') #..

[백준-파이썬] 1753: 최단 경로

문제 보러 가기! 아이디어 라고 할 것도 없는 것 같다. 다익스트라로 풀었다.. 다익스트라..는 전에도 들어는 봤지만, 딱히 공부하지는 않았었다. 이번 기회에 다익스트라를 공부할 수 있었다! 참고한 자료 안경잡이 개발자님의 글과 레드캐럿님의 벨로그 포스팅!!. 안경잡이 개발자님은 영상으로도 있어서, 다익스트라가 뭔지 이해하는 데 도움이 되었고, 레드캐럿님의 벨로그 포스팅은 파이썬 코드라서 코드 구현을 어떻게 해야 할지 알 수 있었다!! 또 플로이드워셜과의 차이점도 궁금했는데, 잘 설명해주셔서 좋았다 ㅎㅎ 코드 👩‍💻 import heapq import sys input = sys.stdin.readline V, E = map(int, input().split()) # 노드 개수, 간선 개수 start =..

[백준-파이썬] 22867: 종점

문제 보러 가기! 문제 🤔 버스가 종점에 들어온다. 종점에 와서는 정비를 해야 하기 때문에, 버스 정비 공간에 가야 한다. 버스가 종점에 들어오는 시각, 종점에서 나가는 시각이 주어진다. 버스 정비 공간이 최소로 몇 개 필요한지 계산하는 문제 즉, 한번에 종점에 버스가 최대 몇 개까지 있는지를 계산하는 문제이다! (단, 같은 시각에 종점에 들어오는 버스- 나가는 버스가 있으면 먼저 나간 후에 출발한다) 아이디어 😍 일단은 버스가 들어오고 나가는 시각이 복잡하게 들어오기 때문에(HH:MM:SS.sss) 편하게 바꿔줬다. 다행히도 들어오는 숫자의 자릿수는 늘 같으니까, 시각에 곱하기 천만 + 분에 곱하기 십만 + 초에 곱하기 천+ 밀리초는 그대로 받아왔다. 그러면 하나의 숫자가 되어서 다루기 편하다. 그리고..

[백준-파이썬] 7562: 나이트의 이동

문제로 GO! 전형적인 BFS를 활용했다. 다만 이동경로가 상하좌우나 대각선이 아니라서 특이했던 것 같다 ㅎㅎ import collections T = int(input()) # 한번 이동에 가는 경우들 directions = [(-2,-1),(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2)] for _ in range(T): l = int(input()) # 체스판 한 변의 길이 start_i, start_j = map(int,input().split()) final_i, final_j = map(int,input().split()) check = list([0]*l for _ in range(l)) # 거기까지 출발점에서 몇 번 이동했는지 체크 D = collect..

[백준-파이썬] 21772: 가희의 고구마 먹방

문제 보러 가기 아이디어, 배운 점 😍 맨 처음엔 가희의 위치를 찾아야 한다. 그리고 가희의 위치를 길로 만들었다.(그래서 갈 수 있도록~) 가희의 위치부터 탐색을 시작한다. 상하좌우를 탐색해서 범위 내이고 장애물이면 못가니까 continue 고구마이면 거기로 이동하되, 시간과 고구마 먹은 양을 1씩 증가 길이면 거기로 이동하되, 시간만 1 증가했다. 시간이 다 되었을 때 먹은 고구마를 최대값으로 갱신한 후에 return을 해주었다. 처음에는 기계적으로..(?) visited 리스트를 만들어서 체크를 할까 했지만, 갔던 길을 또 갈 수 있으니까 체크할 필요가 없었다. 그 자리에 가만히 있을 수도 있다고 했지만 딱히 고려하진 않았다. 만약에 움직여서 고구마를 먹을 수 있으면, 고구마 먹는 게 이득이니까 움..

[백준-파이썬] 11660 : 구간 합 구하기 5

문제 보러 가기! 오늘 카카오 코테를 봤는데, 6번 문제에서 정확성은 다 pass했는데 효율성은 아무것도 통과하지 못했다.ㅠㅠ 접근 방법 자체가 잘못되었다는 것은 알았지만, 어떻게 해야 할지 잘 몰라서 그냥 보내줬다.. 끝나고 스터디 팀원분들께 여쭤보니, 이 문제를 좀 응용해서 풀었다고 하셨다..! 누적합 유형(?)이라는데, 나는 이걸 공부해 본 적은 없었다.. 그래서 처음 공부해서 풀어봤다. 주황색처럼 2차원 리스트가 있는데, 보라색 영역의 값들을 다 더하고 싶을 때! 물론 보라색 영역을 한 번만 물어보면, 2중 for문으로 해결할 수 있을 것이다. 하지만 보라색 영역이 바뀌면서, 여러 번 물어볼 때! 그럴 때마다 2중 for문을 돌리면 너무 시간이 오래 걸린다. 그럴 때 이 누적합 방법을 써주면 된다..

[백준-파이썬] 2812: 크게 만들기

문제 보러 가기! 아이디어 ❄ N자리 숫자가 주어졌을 때, 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 만드는 문제였다! 처음에 한 생각은, '아! 그러면 쭉 보면서 작은 숫자 K개를 없애주면 되려나?' 였다. 1924에서 2개를 지우라고 하면, 가장 작은 숫자 1과 2을 없애면 94가 되는 예제를 보고 한 생각이었다. 그런데 4177252841에서 4개 숫자를 지우라고 하면 어떨까? (예제 3번) 작은 숫자 순서대로 4개.. 1, 2, 2, 1를 없애면 477594가 된다. 이는 정답은 775841과 다르다!! 이건 아니었다.. 그래서 다시 생각해봤다. 그랬더니 가장 큰 수가 되려면, 앞의 자리가 큰 게 중요하다는 것이 생각났다! 그래서 맨 앞부터 보면서, 그게 그 다음 숫자보다 작으면 없애는 식으..

[백준-파이썬] 22942: 데이터 체커

문제 보러 가기! 처음 아이디어 원의 중심 좌표 x 기준으로 정렬 옆에 있는 두 개 원씩 만나는지 보기 라는 아이디어로 짠 코드 두 개 원이 만나는지는 '힌트'에 있는 수학 공식을 참고했다 ! 코드 import sys input = sys.stdin.readline def is_meet(circle1, circle2): x1, r1 = circle1 x2, r2 = circle2 if (x1 - x2) == 0 and r1 != r2: # 동심원 return False if (r1 - r2) ** 2

728x90