Algorithm/Programmers
[프로그래머스] 베스트앨범 / 파이썬 / Python
💡solutions ) 💬 딕셔너리 자료형을 활용하여 문제를 해결함 💬 total_play_times 딕셔너리에 장르별 총 재생횟수를, song_dict에는 장르를 key값으로, 각 곡들의 재생횟수와 고유번호(나중에 정렬할 기준 순서로)를 리스트 형태로 value에 담았다. 💬 sort()를 이용하여 정렬 -> reverse = True로 내림차순 정렬, 정렬하는 기준을 lambda로 표현 고유번호는 작은 게 먼저 나와야 하므로 -음수로 만든 후 내림차순 정렬함. 💬 작년에 동일 문제를 다른 해결 방법(heapq 모듈 사용)으로 풀었던 게 있어서 참고용으로👇 [프로그래머스] 베스트앨범 / 파이썬 / Python / 해시 💫solutions ) 💬 defaultdict, heapq 모듈 사용 👩💻 cod..
[프로그래머스] 위클리 챌린지 / 12주차 / 파이썬
💡solutions ) 💬 permutations 내장 모듈을 사용하여 주어진 던전들을 수행할 순서의 모든 경우를 구한다. 💬 먼저 해당 던전이 최소 필요 피로도를 만족하는지 확인한 후 소모 피로도만큼 initial_k에서 빼준 후 던전의 수를 카운트 해준다 -> cnt += 1 💬 마지막 max내장함수를 통해 cnt 셌던 것과 max_v를 비교하여 최대값을 저장한 후 마지막에 max_v 출력 👨💻code ) from itertools import permutations as permu def solution(k, dungeons): max_v = 0 for p in permu(range(len(dungeons)),len(dungeons)): cnt = 0 initial_k = k for i in p:..
[프로그래머스] 네트워크 / 파이썬 / Python / DFS 알고리즘
💡solutions ) 💬 DFS 알고리즘, stack 자료형을 사용하여 문제 해결함 💬 computer 한대씩 visit 배열을 통해 방문하지 않았으면 dfs함수를 돌린다 -> 다른 컴퓨터들과의 연결성을 확인하여 연결돼 있으면 stack 배열에 넣어주기 -> 이때 방문했다고 visit배열에 cnt값 할당 💬 한번의 dfs 탐색이 끝난 후 cnt +=1 로 1씩 값을 키워주기 (전체 네트워크가 몇개인지 찾기 위한 카운트) 💬 이때 주의해야 할 점은, cnt = 0부터 시작하면 visit배열에서 0으로 표현된 것들이 계속 존재하기 때문에 무한루프 돌기 때문에 cnt = 1부터 시작하여 마지막 출력에서 -1한 값이 정답이 된다. 👨💻code ) def dfs(visit,computers, i, cnt): ..
[프로그래머스] 전력망을 둘로 나누기 / 위클리 챌린지 / 9주차 / 파이썬 / Python
💡solutions ) 💬 전선이 연결돼 있는 형태를 나타내는 adj 인접행렬 만들기 💬 인접행렬을 for문으로 돌며 연결돼 있는 전선을 하나씩 끊어보기 💬인접행렬에서 remove() 메소드를 통해 해당 송전탑을 제거해준 후 연결 상태를 알아보기 위해 connect()함수 실행하기 -> 반환되는 visit 배열, 이때 연결돼 있는 송전탑은 visit배열에서 1로 나타나고, 나머지 송전탑은 0으로 나타내기 때문에 이들의 카운트 한 값의 차이의 최소값을 구하면 된다. 💬 전선 끊었던 것을 다시 연결해주어 다음 송전탑을 비교해야 한다. -> for문을 돌리고 있기 때문에 순서에 지장을 주지 않기 위해 adj[i] = [tmp] + adj[i] 으로 인접리스트 맨 앞쪽으로 확인한 송전탑(tmp)를 붙여줘야 하는..
[프로그래머스] 소수 찾기 / 파이썬 / python
💡solutions ) 💬 permutations 함수로 주어진 numbers로 만들 수 있는 숫자들을 모두 만든 후 -> permu_res라는 set 자료형에 담아 숫자들의 중복을 제거해준다. 💬 decimal()이라는 소수 찾는 함수를 구현하여 모든 숫자에 대해서 소수인지 아닌지 판별하여 answer 구하기 👨💻code ) from itertools import permutations as permu def decimal(num): if num == 0 or num == 1: return False for i in range(2, num): if num % i == 0: return False else: return True def solution(numbers): answer = 0 numbers..
[프로그래머스] 위클리 챌린지 10주차 / 파이썬 / Python
💡solutions ) 💬 해당 문제는 좌표평면 및 직선의 교점을 구하는 등 수학적 요소가 있는 문제라서 처음에는 헤맬 수도 있으나 문제의 참고사항에서 주어진 두 직선의 교점을 구하는 공식을 사용하면 어렵지 않게 교점의 위치를 찾을 수 있다. 💬start_points에 별을 찍는 위치를 저장하는데 이때 정수로만 표현되는 위치인지 확인하기 위해 is_integer() 메소드를 사용한다. 💬 별이 찍히는 점들의 x,y의 최대 최솟값을 구하여 배열의 크기를 지정한다. 여기까지는 쉽게 구할 수 있었지만 그 다음 수학적 좌표평면을 컴퓨터의 좌표평면 형태로 변환하는 과정에서 조금 헤맸다. 💬 4개의 사분면이 영역이 있는 좌표평면을 -> 1 사분면만 존재하도록 바꾸며 이때 오른쪽 맨위 첫 시작이 (0,0)부터 시작하..
[프로그래머스] 게임 맵 최단거리 / 파이썬 / BFS
💡solutions ) 💬 BFS 알고리즘을 통해 최단 경로를 찾는 문제 💬 이때 거리를 찾고, 또 이미 지났던 경로를 다시 방문하지 않기 위해 visit 배열을 만들어서 거리를 저장하기 👨💻code ) from collections import deque def solution(maps): answer = 0 dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1] q = deque([(0, 0)]) visit = [[0]*len(maps[0]) for _ in range(len(maps))] visit[0][0] = 1 maps[0][0] = 0 while q: x, y = q.popleft() for k in range(4): nx, ny = x + dx[k], y + dy[k] if 0
[프로그래머스] 신규 아이디 추천 / 파이썬 / python / 2021 KAKAO BLIND RECRUITMENT
💡solutions ) 💬 총 7단계까지 주어진 조건을 모두 구현하면 되는 시뮬레이션 문제다. 💬 해당 문제를 풀 때 주의해야 할 점은 문자를 제거하거나 슬라이싱할 때 문자열(해당 문제풀이에선 문자를 리스트에 저장하여 사용했음) 길이가 0이 아닌지, 인덱스 에러가 나지 않는지 확인해야 하는 것이다. 👨💻code ) def solution(new_id): # 1단계 new_id = new_id.lower() # 2,3단계 id_list = [] for i in new_id: if i.isalnum() or i in ['-', '_', '.']: if id_list: if i == '.' and id_list[-1] == '.': continue id_list.append(i) # 4단계 if id_lis..
[프로그래머스] 위클리챌린지 / 1주차 / 부족한 금액 계산하기 / 파이썬 / python
💡solutions ) 💬 while 반복문을 돌며 해당 카운트별 이용료를 더해주고 마지막에 가지고 있는 money와 금액을 비교한다. 👨💻code ) def solution(price, money, count): required_money = 0 current_count = 1 while current_count money else 0 📌description ) 코딩테스트 연습 - 1주차_부족한 금액 계산하기 새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기..
[프로그래머스] 모의고사 / 파이썬 / Python
👨💻code ) def solution(answers): first = [1,2,3,4,5] second = [2,1,2,3,2,4,2,5] third = [3,3,1,1,2,2,4,4,5,5] res = [[1,0], [2,0], [3,0]] for i in range(len(answers)): if answers[i] == first[i % len(first)]: res[0][1] += 1 if answers[i] == second[i % len(second)]: res[1][1] += 1 if answers[i] == third[i % len(third)]: res[2][1] += 1 target, max_cnt = [], 0 for num, cnt in res: if cnt > max_cnt: ..
[프로그래머스] 행렬 테두리 회전하기 / 파이썬 / Python / 2021 Dev-Matching: 웹 백엔드
💡solutions ) 💬 정해진 행렬 범위의 맨 상단 오른쪽(a, b)에서 부터 시작해서 → ↓ ← ↑ 순으로 행렬 테두리를 회전한다. 💬 이전 값을 before에 저장해놓고 인덱스를 이동하며 행렬 테두리 안의 값들을 바꿔준다. 💬 이때 이동할 때마다 min()함수를 이용해서 행렬 테두리에 해당하는 값들 중 최소값을 판별한다. 👨💻code ) def solution(rows, columns, queries): arr = [[0]*columns for _ in range(rows)] num = 1 answer = [] for i in range(rows): for j in range(columns): arr[i][j] = num num += 1 for a,b,c,d in queries: before =..
[프로그래머스] 파일명 정렬 / 파이썬 / python / 2018 KAKAO BLIND RECRUITMENT
💡solutions ) 💬 전형적인 문자열 문제로 먼저 정렬 기준인 head와 number로 분류하기 이때 tail은 정렬 기준에 해당 하지 않으니까 break 💬해당 문제에서 주어진 테스트케이스에선 걸리진 않았지만, 숫자의 경우 최대 다섯 자리로 이뤄져 있기 때문에 len(number)로 길이 체크해줘서 tail 부분에 있는 숫자가 number로 분류되지 않도록 조건 처리해줬다. 💬 정렬 순서대로 changed 배열에 담으며 이때 원래의 파일명을 함께 저장하여 마지막에 출력할 수 있도록 한다. 💬 정렬은 sort() 내장함수를 통해 정렬하였다. 👨💻code ) def solution(files): changed = [] idx = 0 for file in files: head = '' number =..