본문 바로가기

알고리즘

[baekjoon] 14500. 테트로미노 로직 시작점을 옮기면서 그림을 돌려가면서 합계를 구하고, 최댓값과 비교한다. 코드 N, M = map(int, input().split()) board = [list(map(int, input().split())) for _ in range(N)] move1 =[[[0,0],[1,0],[2,0],[3,0]], # ㅡ [[0,0],[0,1],[0,2],[0,3]]] move2 = [[[0,0],[0,1],[1,0],[1,1]]] # 네모 move3 =[[[0,0],[1,0],[2,0],[2,-1]], # ㄴ [[0,0],[0,-1],[1,0],[2,0]], [[0,0],[1,0],[2,0],[2,1]], [[0,0],[1,0],[2,0],[0,1]], [[0,0],[0,-1],[0,-2],[1,0]], [.. 더보기
[baekjoon] 14502. 연구소 로직 벽이 추가로 세워질 수 있는 곳에 벽을 세우면서 진행한다. 세울 때마다 기존의 board판에 추가해야하며, 세우고나서 바이러스들이 이동한다. 바이러스 이동하는 것을 move라는 함수를 만들어 매번 사용한다. 이때, 안전한 공간 갯수는 처음에 0인 값들을 cnt에 다 넣고, 벽이 3개가 추가되니까 cnt - 3하고, 바이러스가 이동한 공간의 갯수를 빼준다(바이러스 이동 공간갯수는 move함수에서 return한다.) 코드 from collections import deque from itertools import combinations from copy import deepcopy N, M = map(int, input().split()) board = [list(map(int, input().spli.. 더보기
[programmers] 보석쇼핑 로직 1. 투포인트 기법을 사용해야한다. 아니면 효율성에서 걸린다. (나한테는 낯설고 어려웠던 문제,,,ㅠ) 2. 보석을 다 안가지고 있으면 end를 올려주고 보석을 다 가지고 있으면 start를 올려준다고 생각하면 된다. 3. 로직 설명 모든 보석을 가지고있지 않다면, end를 하나씩 늘려서 다음 보석을 가진다. 모든 보석을 가지고 있다면, start, end의 차이가 최소가 되는 경우로 갱신한다. 갱신한 후에는 start를 한칸 씩 옮기면서 더 최소를 만들 수 있는지 확인한다. check = dict()에서 갯수를 확인하며, start를 한칸씩 올리기때문에 범위 안에 들어오지 않게 되는 보석은 갯수를 내려준다. 이때 만약에 보석이 0개가 되었다면, check에서 지워주고 다시 그 보석이 생겨 모든 보.. 더보기
[baekjoon] 3190. 뱀 로직 1. 구현문제. 문제에서 하라는대로 그대로하면 되는데, 실제로 코드를 돌렸을 때 에러들이 많이 발견됨.(내 구현 능력부족) 코드 from collections import deque N = int(input()) K = int(input()) board = [[0 for _ in range(N)] for _ in range(N)] for k in range(K): x, y = map(int, input().split()) board[x-1][y-1] = 1 # 사과1, 뱀2, 빈칸0 L = int(input()) change = {} # 리스트가 아닌 dict로 하는 이유 # dict로 하면 밑에서 시간에 해당할 때 time이 change에 해당하는게 있다면 change_move함수를 써야하는데 이.. 더보기
[programmers] 카카오프렌즈 컬러링북 코드 from collections import deque from copy import deepcopy def solution(m, n, picture): near = [(0, 1), (1, 0), (0, -1), (-1, 0)] # visit = [[0 for _ in range(n)] for _ in range(m)] pic = deepcopy(picture) # print(visit) mymax = 0 q = deque() cnt = 0 result = [] for i in range(m): for j in range(n): if picture[i][j] != 0: q.append([i, j]) cnt += 1 answer = 0 while q: x, y = q.popleft() temp = pi.. 더보기
[programmers] 가장 큰 수 로직 1. 숫자마다 첫번째 오는 숫자가 큰 것부터 나열하면 된다 -> [6, 10, 2, 11]이면 [6, 2, 11, 10]이 되도록. - 처음에는 하나하나 비교하려했는데,, 쉽지 않을것같아서 자리수를 맞추고 비교하려고 한다. - numbers의 원소가 0이상 1000이하이니까 만단위로 바꾸기 - 이후 sort해서 join으로 붙이기 코드 def solution(numbers): numbers = list(map(str, numbers)) check = [] if ''.join(numbers) == '0' * len(numbers): # print('yes') return '0' for number in numbers: if len(number) == 4: check.append((number, num.. 더보기
[programmers] 문자열 압축 로직 1. s를 돌면서 앞에 값이랑 뒤에 값이랑 비교한다. 이때, 1~len(s)//2+1 개까지 돌리면서비교한다. - len(s)의 반만 돌아도 괜찮다. 어차피 최대가 ababcdcdababcdcd->2ababcdcd이기때문 2. temp라는 빈 문자열을 두고, i(1~len(s)//2+1)가 돌때마다 새롭게 만들어지는 문자열의 갯수를 비교할 것이다. 3. cnt는 같은 앞에 값이랑 뒤에 값이 같을때마다 더해주고, cnt=1일때는 그냥문자만 temp에 넣고, cnt가 1보다 크다면 cnt와 문자 둘다 넣는다 4. 그리고 나서 cnt를 다시 초기화해준다. -> aabbacc에서 2a3b로 나왔다. 이는 cnt가 제때 갱신이 되지 않아서임 5. 그리고 앞에 값을 뒤에값으로 바꿔준다. -> 앞에 값을 뒤의 .. 더보기
[programmers] 소수찾기(12921) 코드 def solution(n): numbers = set(i for i in range(2, n+1)) for i in range(2, n + 1): if i in numbers: numbers -= set(j for j in range(2 * i, n + 1, i)) print(numbers) return len(numbers) 주의할 점 1. set으로 제거하지 않고, numbers를 하나하나 다 찾으면 효율성에서 실패,,ㅠ 더보기