본문 바로가기

백준99

나이순 정렬 - 10814번 2중 배열을 만들어 담은 후 정렬을 해주면 된다. 인덱스 번호 0번을 기준으로 정렬하는 방법은 lambda 함수를 사용하여 만들어줬다. n = int(input()) arr = [] for _ in range(n): a,b = input().split() arr.append([int(a),b]) arr.sort(key = lambda x : x[0]) for i in arr: for j in i: print(j,end=' ') print() 2022. 10. 9.
영화감독 숌 - 1436번 처음에 만들어지는 수들 간에 규칙을 찾으려고 시간을 쏟았지만 마땅한 규칙을 찾진 못하였다. 그래서 666부터 1씩 더해가며 수에 '666'이 있는지 검사하는 방식을 사용했다. n = int(input()) no = 0 cnt = 665 while no 2022. 10. 5.
적록색약 - 10026번 bfs로 문제를 해결하였다. graph를 2개, bfs함수를 3개를 만들어서 사용했다. 한 for 루프 안에서, 정상인의 결과를 구하고, 적록색약인 사람의 결과를 따로 구해줬다. import sys from collections import deque t = int(input()) graph = [[0] * 101 for _ in range(101)] special_graph = [[0] * 101 for _ in range(101)] d = [[1, 0], [-1, 0], [0, 1], [0, -1]] for y in range(t): inn = sys.stdin.readline() for x in range(t): graph[y][x] = inn[x] special_graph[y][x] = inn[x.. 2022. 10. 4.
미로탐색 - 2178 번 bfs로 해결하였다. 처음 시작점으로부터 마지막 점까지의 계층을 구분짓기 위하여 while 문 다음에 데큐 크기를 중심으로 for 문을 하나 끼워줬다. import sys from collections import deque # y_axis == n, x_axis == m y_axis, x_axis = map(int,input().split()) # 방향 d = [[1,0],[-1,0],[0,1],[0,-1]] graph = [[0]*101 for _ in range(101)] visited = [[False]*101 for _ in range(101)] for y in range(y_axis): a = sys.stdin.readline() for x in range(x_axis): graph[y][x].. 2022. 10. 4.
유기농 배추 - 1012번 BFS로 해결하였다. x, y로 나타낼 수 있는 문제의 어려웠던 점은 2중 배열로 표현을 하거나, 인덱스로 접근할 때, y와 x의 위치를 바꿔서 사용해줘야 한다는 점이다. 가로 5칸, 세로 3칸을 x = 5, y = 3이라 할 수 있다. 이것을 우리가 익숙한 좌표평면행태로 보고 싶다면 arr[5][3] 이 아니라 arr[3][5]모양으로 만들어줘야한다. (파이썬에서는 이런방식으로 array를 표현하지 않지만 편의상 이렇게 적었다.) arr[3][5]를 파이썬 식으로 표현하면 arr [ [ 0 ] * 5 for _ in range(3) ] 이고, arr = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 로 보인다. 만약 이 배열에서 x = 2, y = 1 에 .. 2022. 10. 4.
N과 M (2) - 15650 번 백트래킹 함수에서 바로 출력하지 않고 미리 배열에 담아둔 다음 중복되는 것을 빼고 출력해주는 과정을 마지막에 넣어줬다. n, m = map(int,input().split()) arr = [0] * 10 visited = [False] * 10 ans = [] def bt(idx): if idx == m: p = arr[:m] p.sort() ans.append(p) return for i in range(1, n+1): if not visited[i]: arr[idx] = i visited[i] = True bt(idx+1) visited[i] = False bt(0) result = [] for i in ans: if i not in result: for j in i: print(j,end=' ') .. 2022. 10. 3.
N과 M (1) - 15649 번 백트래킹 알고리즘의 기본문제이다. 재귀적으로 돌아가는 dfs 이며, 탐색이 끝나면 바로 전 단계로 돌아가는 형식을 취한다. n,m = map(int,input().split()) # 입력값들의 최대값이 8이므로 넉넉히 10칸으로 만들어줌 arr = [0]*10 is_used = [False]*10 # backtracking funtion def bt(idx): if idx == m: for i in range(m): print(arr[i],end=' ') print() return for i in range(1,n+1): if not is_used[i]: arr[idx] = i is_used[i] = True print('다음 bt', idx + 1) print(arr) print(is_used) bt(.. 2022. 10. 2.
ACM 호텔 - 10250 번 예제를 보며 패턴을 파악하여 코드를 짜면 된다. 반례 참고 : 1 6 12 59 답 : 510 import sys t = int(input()) for _ in range(t): h, w, n = map(int, sys.stdin.readline().split()) gh = 1 floor = 1 while True: if n = 10: print(f'{floor}{gh}') else: print(f'{floor}0{gh}') 2022. 10. 1.
이항 계수 1 - 11050번 combination 계산 방식을 구현해주었다. a, b = map(int, input().split()) s = 1 for i in range(1,b+1): s *= a s /= i a-=1 print(int(s)) 2022. 10. 1.
분해합 - 2231번 이론상 가능한 작은 최소 생성자부터 시작해서 1씩 증가시키면서 탐색하는 방식으로 문제를 해결했다. 특정 값들에서 오류가 발생하여 여러 반례를 찾아가면서 코드를 마무리 지었다. 반례 2 -> 1, 1 -> 0, 1000000 -> 0 ... n = int(input()) # 만약 n 이 3자리수라면 9 + 9 + 9 = 27 , # 9*3 보다 작은 수가 최소 생성자의 한계이다. # n 이 k자리수의 수면 k - 9*k 부터 1씩 증가시키면서 탐색 k = len(str(n)) # print(k, n - 9 * k) def ten_sum(n): # print(n) a = str(n) aa = 0 for i in a: aa += int(i) return aa + n if n - 9 * k > 0: for i .. 2022. 9. 30.
팰린드롬수 - 1259번 입력받을 수를 문자로 입력받아 뒤집어서 같은지 확인해준다. 문자열[::-1]을 하면 뒤에서부터 문자열 슬라이싱이 들어가 뒤집은 것과 같다. while True: n = input() if n == '0': break elif n == n[::-1]: print('yes') else: print('no') 2022. 9. 30.
RGB거리 2 - 17404번 RGB거리 - 1149번 위 문제와 비슷하지만 가장 마지막 집의 색이 가정 첫번째 집과는 달라야하는 다른점이 있다. 가장 첫번째 집이 선택됬는지 확인하면서 코드를 짤 필요가 있다. 각 색이 선택되었을 때 N번째 집까지 코드를 돌린 후, 선택한 색의 집을 뺀 나머지 두 집의 최소값을 저장한다. 그렇게 색 3가지를 모두돌린 후 각 색을 선택했을 때 나온 최소값 3개를 비교하여 가장 작은 수를 출력한다. 색을 선택하는 것을 코드화 할 때, 선택한 색을 제외한 나머지 색들은 1번 집에서 1001의 비용이 든다고 가정하면 무조건 선택이 되지 않을 것이다. N번째 집까지 코드가 돌아가면 선택한 색을 빼고 나머지 2개의 색만 비교하면 된다. 처음에 입력받은 house를 복사하는 과정에서 얕은 복사를 사용하여 예제가 .. 2022. 9. 29.