Coding Test 29

[Sorting] H-Index

https://school.programmers.co.kr/learn/courses/30/lessons/42747 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 흔히 알고 있는 H-Index를 계산하는 문제입니다. citations을 정렬하고, h를 0부터 10,000까지 반복하여 h편이상 인용된 논문 수를 c, 나머지 논문 수를 r에 저장합니다. 주어진 조건에 맞게 c >= h and r = citations[i]일 때만 i의 값을 1증가시킵니다. def solution(citations): answer = 0 citations.sort() print(..

Coding Test/Sorting 2023.09.08

[Sorting] 가장 큰 수

https://school.programmers.co.kr/learn/courses/30/lessons/42746 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr numbers가 [6, 10, 2]일 경우 원소값이 정수이기 때문에 오름차순 정렬하게되면 10, 6, 2를 얻게됩니다. 따라서, 먼저 떠오른 아이디어는 "문자열로 변경 후 정렬하면 되지 않을까?"였습니다. def solution(numbers): answer = '' numbers = sorted(map(str, numbers), reverse=True) answer = ''.join(n for ..

Coding Test/Sorting 2023.09.07

[DFS & BFS] 게임 맵 최단거리

https://school.programmers.co.kr/learn/courses/30/lessons/1844 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 보통 DFS는 완전 탐색에 사용되고, BFS는 최단 거리 계산에 사용되기 때문에 "게임 맵 최단거리" 문제는 BFS로 해결할 수 있습니다. 이 문제는 미로 탈출문제 유형입니다. 각 포인트마다 최단거리를 모두 구하고 마지막 graph[n - 1][m - 1]의 값을 반환하면 됩니다. 이동은 dx, dy 리스트에 상하좌우 이동 관련 좌표 변경 값을 넣어줍니다. 그리고 이 네 가지 방향으로 이동한 후 이..

[DFS & BFS] 타겟 넘버

https://school.programmers.co.kr/learn/courses/30/lessons/43165 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 해당 문제는 numbers의 부호를 모두 탐색해야 하는 완전 탐색 문제입니다. 보통 DFS는 완전 탐색에 사용되고, BFS는 최단 거리 계산에 사용되기 때문에 "타겟 넘버" 문제는 DFS로 해결할 수 있습니다. numbers의 모든 값들에 대하여 +, -를 했을 때, 그 합이 target 값과 일치하는지만 확인하면 되기때문에 다른 완전 탐색 문제보다는 쉽게 해결했습니다. def dfs(number..

[Implementation] 문자열 압축

https://school.programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문자열을 앞쪽부터 n개 단위로 압축했을 때, 최소 문자열의 크기를 계산하는 문제입니다. 문자열의 최대 크기는 문자열의 크기만큼이기 때문에, 1부터 size까지 반복하여 n개 단위의 문자열과 그 뒤에 나오는 n개 단위의 문자열을 비교하며 몇 개의 문자열이 일치하는지 계산합니다. 따라서, cnt의 디폴트값은 1이며 1을 초과할 경우에만 숫자를 문자열에 포함합니다. 또한 다음 n개 단위의 문자열이 이전..

[Greedy] 구명보트

https://school.programmers.co.kr/learn/courses/30/lessons/42885 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 코딩테스트를 볼 때, 가장 중요한 건 문제를 정확히 파악하는 것입니다. "구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없다"라는 문구를 제대로 못 봐서 많이 헤맸습니다.. "구명보트" 문제는 people 리스트를 정렬한 후 최댓값과 최솟값을 더해서 limit을 초과하는지 판단 후 구명보트의 최소 개수를 구하면 됩니다. def solution(people, limit): answer = 0 ..

Coding Test/Greedy 2023.09.07

[Greedy] 조이스틱

https://school.programmers.co.kr/learn/courses/30/lessons/42860 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 조이스틱 상하 방향은 원형 큐나 아스키코드 변환하는 함수인 ord()를 이용하여 쉽게 계산할 수 있습니다. '조이스틱'문제는 'A'문자열이 존재할 때, 좌우 방향을 최소화 하는 것이 핵심입니다. 사실, 이 문제는 연속된 'A'문자열 중 최소 이동 횟수를 계산해야 하기 때문에 가장 작은 또는 큰 값을 계속 선택해 나가는 그리디보다는 완전 탐색에 가깝습니다. 코드는 다른 사람의 풀이를 참조했습니다. ..

Coding Test/Greedy 2023.09.06

[Greedy] 체육복

https://school.programmers.co.kr/learn/courses/30/lessons/42862 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 제한사항 중 "여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다."가 있기 때문에 lost와 reserve 리스트 중 중복되는 부분을 먼저 삭제하고, answer 값을 n - len(lost)로 초기화합니다. 이후에 체육복을 빌려줄 수 있는지 if r - 1 =..

Coding Test/Greedy 2023.09.05

[Algorithm] 최단 경로 (Shortest Path)

최단 경로(Shortest Path)는 말 그대로 가장 짧은 경로를 찾는 알고리즘입니다. 흔히 알고 있는 최단 경로 알고리즘은 다익스트라(Dijkstra)입니다. 플로이드 워셜(Floyd-Warshall) 알고리즘 등도 존재하지만, 본 포스팅에서는 다익스트라만 다루겠습니다. 다익스트라 최단 경로 알고리즘은 그리디 알고리즘으로 분류되며, 매 상황에서 가장 비용이 적은 노드를 선택해 임의의 과정을 반복하는 것입니다. 다익스트라 알고리즘 과정 1. 출발 노드 설정 2. 최단 거리 테이블 초기화 3. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택 4. 해당 노드를 거쳐 다른 노드로 가는 비용을 계산하여 최단 거리 테이블 갱신 5. 위 과정에서 3번과 4번을 반복 위와 같이 노드와 노드 간 거리(..

[Dynamic Programming] 1로 만들기

https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net def solution(x): for i in range(2, x + 1): d[i] = d[i - 1] + 1 if i % 2 == 0: d[i] = min(d[i], d[i // 2] + 1) if i % 3 == 0: d[i] = min(d[i], d[i // 3] + 1) return d[x] d = [0] * 1000000 x = 10 print(solution(x))# 3 DP 테이블인 리스트 d를 10^6만큼 초기화합니다. 그리고 사용 가능한 연산 기능 세 가지 중 가장 작은 값(최소 연산 값)을 ..