본문 바로가기

[BOJ] - Python

(45)
[백준] 18870 : 좌표 압축 python 1. arr에 입력받은 좌표들을 저장함 2. s에 arr를 집합으로 바꾼 것을 저장함(중복제거) 3. sorted_arr에 arr의 인덱스와 arr의 원소를 저장함 4. sorted_arr를 내림차순 정렬함 5. sorted_arr의 값을 하나씩 확인하면서 그 값이 집합s 안에 있다면 집합에서 그 원소를 제거하고 집합 원소의 개수를 계산함 res라는 리스트에 [arr에서의 인덱스, arr 원소의 값, 집합의 길이(자신보다 작은 숫자의 개수]를 저장함 6. res의 2번열 즉, 자기보다 작은 수의 개수를 출력함 n = int(input()) arr = list(map(int,input().split())) s = set(arr) sorted_arr = [] for i in range(len(arr)): s..
[백준] 단계별로 풀어보기 - 정렬 2750, 2587, 25305, 2751, 10989, 1427, 11650, 11651 python 2750 : 수 정렬하기 import sys input = sys.stdin.readline n = int(input()) array = [] for i in range(n): array.append(int(input())) array.sort() for i in array: print(i) 2587 : 대표값2 n = 5 arr = [] for i in range(n): arr.append(int(input())) arr.sort() # int로 형변환해주지 않으면 34.0이런 식으로 출력됨 print(int(sum(arr)/n)) print(arr[n//2]) 25305 : 커트라인 n, k = map(int,input().split()) arr = list(map(int,input().split()..
[백준] 10814 : 나이순 정렬 python 배열에 들어온 순서, 나이, 이름순으로 저장했고 출력도 맞게 나오는데 계속 오답 판정이 나왔다. import sys input=sys.stdin.readline n=int(input()) arr=[] for i in range(n): arr.append([i]+list(input().split())) arr.sort(key=lambda x:(x[1],x[0])) for i in arr: print(i[1],i[2]) 그때 제출한 코드는 이건데, 나이도 str형으로 입력받아서 정렬이 제대로 되지 않은 게 문제였다. 정수 123과 13을 비교하면 123
[백준] 1181 : 단어 정렬 1. 실행시간 단축을 위해 sys 라이브러리를 import하고 input()함수로 sys.stdin.readline()을 사용할 수 있도록 세팅한다. 2. n을 입력받는다. 3. 문자열을 저장할 리스트를 생성한다. 4. list.append()로 n개의 문자열을 입력받을 때마다 리스트에 append해준다. 이때 sys.stdin.readline()은 개행문자 '\n'까지 입력받는다는 걸 주의해서 strip()을 수행하는 걸 잊으면 안된다. 5. list.sort()로 문자열을 사전순으로 정렬한다. 6. list.sort(key=len)으로 문자열의 길이에 따라 다시 정렬해준다. 7. 정렬된 문자열의 내용을 출력한다. 문제에서 주어진 조건은 길이의 오름차순으로 정렬 -> 사전의 오름차순으로 정렬을 하는 것..
[백준] 10971 : 외판원 순회 2 python import sys input = sys.stdin.readline def dfs(depth, start, value): global min_value # n개의 도시를 모두 방문했을 때 시작점으로 돌아가는 길이 있다면 if depth == n and graph[start][0]!=0: # 이번 탐색에 소요된 비용과 지금까지 구해둔 최소비용과 비교함 min_value = min(min_value,value+graph[start][0]) return # 이미 최소비용을 넘겼다면 더 탐색할 필요가 없음 if value>min_value: return for i in range(n): # 아직 방문하지 않았고 갈 수 있는 도시가 있다면 if visited[i]==0 and graph[start][i]!=0: ..
[백준] 1697 : 숨바꼭질 python 스타트링크 문제와 매우 유사한 문제였다. 100,000을 넘지 않는 범위에서 X+1, X-1, X*2로 이동하는 경우의 이동횟수를 리스트에 저장하면서 BFS 탐색을 해줬다. from collections import deque n,k = map(int,input().split()) MAX = 100001 def bfs(s,k): # 0번째 열에는 방문체크를 # 첫 번째 열에는 이동하는 데에 걸린 시간을 저장함 visited =[[0]*2 for i in range(MAX)] queue = deque() queue.append(s) visited[s][0] = 1 visited[s][1] = 0 while queue: # 현재위치를 c에 저장함 c = queue.popleft() if c==k: print..
[백준] 2573 : 빙산 python 아이디어를 떠올리는 건 어렵지 않았지만 코드를 써가면서 반복문이 이렇게 많이 나오는 게 맞나..싶었다. 처음 제출한 코드가 시간초과가 나와서 역시 너무 비효율적이었구나 했는데 다른 사람들의 풀이를 참고해봐도 시간초과가 나오더라. 해결방법은 pypy3로 제출하는 거였다. NxM 사이즈의 cnt 리스트를 하나 만들고 BFS 탐색을 하다가 인접한 칸 중에 0인 게 있으면 cnt 리스트의 해당 위치값을 1씩 증가시켜두고, 빙산의 높이를 한 번에 바꿔주는 게 핵심이다. 모든 빙산이 녹았다는 걸 판단하기 위한 방식에 대해 고민을 많이 했었다. total = 0 # graph는 NxM 사이즈의 리스트 for g in graph: total += sum(graph) if total==0: # 모든 빙산이 녹았으니 0을..
[백준] 5014 : 스타트링크 python [f+1][2] 크기의 visited라는 list를 생성하고 0번 열에 방문체크를, 1번 열에 버튼을 누른 횟수를 저장해서 풀었다. from collections import deque f,s,g,u,d = map(int,input().split()) visited=[[0 for j in range(2)]for i in range(f+1)] def bfs(s,g): queue = deque() queue.append(s) visited[s][0]=1 while queue: a = queue.popleft() # 목표 지점에 도달했으면 횟수를 출력하고 리턴 if a==g: print(visited[a][1]) return # 위에 아직 방문하지 않은 층이 있다면 이동 if a+u0 and visited[a..