Computer Science/Algorithm 97

[Python 3] 프로그래머스 Lv. 3 n+1 카드게임

https://school.programmers.co.kr/learn/courses/30/lessons/258707?language=python3 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr def delete_card(a,b,t): for i in a: if t-i in b: a.remove(i) b.remove(t-i) return True return False def solution(coin, cards): answer=1 n=len(cards) mycard=[cards[i] for i in range(n//3)] index=n//3 leftov..

[Python 3] BOJ 1256 사전

https://www.acmicpc.net/problem/1256 1256번: 사전 동호와 규완이는 212호에서 문자열에 대해 공부하고 있다. 김진영 조교는 동호와 규완이에게 특별 과제를 주었다. 특별 과제는 특별한 문자열로 이루어 진 사전을 만드는 것이다. 사전에 수록되 www.acmicpc.net 오늘의 문제는 사전 이라는 문제이다. 친구의 추천을 받고 문제를 접하게 되었는데, 평소에 확률과 통계 과외를 해왔어서, 바로 중복조합이라는 아이디어를 얻었다. 중복조합이란, 서로 다른 n개 중 k개를 중복을 허용하며 순서를 고려하지 않고 선택하는 것을 말합니다. 이렇게 정의를 보면, 정확하게 와닿기가 쉽지 않다. 쉽게 생각하면, a,b,c,d 총 4명의 후보가, 그리고 10명의 투표인단이 있다고 생각하자. ..

[Python 3] LEETCODE 141. Linked List Cycle

class Solution: def hasCycle(self, head: Optional[ListNode]) -> bool: fast=head slow=head while fast and fast.next: fast=fast.next.next slow=slow.next if fast==slow: return True return False 플로이드의 토끼와 거북이 알고리즘 (Floyd's Tortoise and Hare Algorithm)을 이용하였다. 플로이드의 토끼와 거북이 알고리즘이란, Cycle이 존재하는 링크드 리스트에서 토끼와 거북이가 있고, 토끼는 한 번에 두 칸씩, 거북이는 한 번에 한 칸씩 움직인다고 하자. 둘이 만났을 때 거북이를 시작점으로 옮기고, 토끼와 거북이 둘 다 한칸씩 이동시키..

[Python 3] BOJ 23288 주사위 굴리기 2

최근 구현 문제를 푸는데 있어서 부족함이 있음을 깨닫고, 복잡하고 긴 글을 가진 문제를 정확하게 해석하는 문제들을 해결하려고 노력 중이다. 바로 이 주사위 굴리기 2 같은 문제이다. https://www.acmicpc.net/problem/23288 23288번: 주사위 굴리기 2 크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 가장 왼 www.acmicpc.net 문제가 정말 친절하면서도, 복잡하다. 천천히 독해해보도록 하자. 먼저 보드게임판이 있다고 상상을 해보자. 맨 위쪽 끝에 주사위가 위치해있다. 1가 맨 위에 그려져있고, 6이 바닥에 있다. 처음에는, ..

[Python 3] BOJ 2036 수열의 점수

https://www.acmicpc.net/problem/2036 2036번: 수열의 점수 n개의 정수로 이루어진 수열이 있다. 이 수열에서 한 정수를 제거하거나, 또는 두 정수를 제거할 수 있다. 한 정수를 제거하는 경우에는 그 정수가 점수가 되고, 두 정수를 제거하는 경우에는 두 www.acmicpc.net 오늘 볼 문제는 수열의 점수라는 문제이다. 해당 문제는 한 개의 숫자를 제거해서 정답에 더하거나, 두 개의 숫자를 제거해서 제거한 두 숫자를 곱한 것 정답에 더할 수 있다. 이 점수의 합의 최대값을 구하면 된다. n=int(input()) pos=[] neg=[] zero=0 one=0 for _ in range(n): num=int(input()) if num>1: pos.append(num) ..

[Python 3] BOJ 1253 좋다

https://www.acmicpc.net/problem/1253 1253번: 좋다 첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수) www.acmicpc.net 오늘 풀어볼 문제는 '좋다'라는 문제이다. 굉장히 간단하면서도, 막상 구현하려니 쉽지 않은 골드 문제이다. n=int(input()) data=list(map(int,input().split())) data.sort() answer=0 for i in range(n): num=data[i] left=0 right=n-1 while left!=right: temp=data[left]+data[right] if i==left: ..

[Python 3] BOJ 26093 고양이 목에 리본 달기

평소에 약한 DP를 연습하기 위해서 해당 문제를 풀었다. 이 문제에서는 고양이들을 일자로 세워두는데, 양 옆에 같은 리본을 둔 고양이를 세워둘 수 없다. 그래서, 조금 나이브하게 접근을 했는데, 만약 가능하면 전 고양이한테 제일 큰 만족도를 얻을 수 있는 리본을 해주려고 한다. 만약, 전 인덱스에 있는 고양이들 중 제일 큰 만족도를 가진 고양이가 해당 리본을 하고 있다면, 두번째로 많은 만족도를 가진 고양이에서 따온다. 이를 더욱 간결하게 가져오기 위해서, 파이썬의 heapq 라이브러리를 사용했다. maximum heap를 구현해서 만족도 1등, 2등을 매번 효율적으로 가져올 수 있도록 하였다. import heapq n,k=map(int,input().split()) data=list(list(map(..

[Python 3] BOJ 31423: 신촌 통폐합 계획

이번 SUAPC WINTER 2024에 나왔던 H번 문제, 신촌 통폐합 계획이였다. (다음 번에 SUAPC에 대해서 게재해보겠습니다.) https://www.acmicpc.net/problem/31423 31423번: 신촌 통폐합 계획 첫 번째 줄에 대학교의 개수 $N$이 주어진다. $(2 \leq N \leq 500 \, 000)$ 다음 $N$개의 줄의 $i$번째 줄에 대학교 이름을 의미하는 알파벳 소문자로 이루어진 문자열 $s_i$가 주어진다. 주어지는 대학교 www.acmicpc.net 처음에 이 문제를 봤을 때, 직관적인 풀이인 단순한 DFS로 접근했다. import sys sys.setrecursionlimit(int(5*1e5+1)) input=sys.stdin.readline n=int(in..

[Python 3] BOJ 23743 방탈출

굉장히 재밌게 풀었던 MST 문제였다. 방들끼리의 연결 관계가 주어져있고, 이들 사이에 워프를 만들 수 있는 시간이 주어져 있다. 또한, 바로 밖으로 나갈 수 있는 긴급 탈출구 설치에 걸리는 시간이 주어져 있다. 이들을 단순히 "두 점 사이의 간선의 길이"라고 표현하겠다. 이 문제의 예제 입력의 상황을 그림으로 표현해보겠다. 첫 번째 예제이다. 1번, 2번, 3번 긴급 탈출로 탈출하는 것 보다, 세 개의 간선 (1-2, 2-3, 3-1) 중 두 개를 선택하고, 3 정점 중 한 개의 긴급탈출을 만들어서 탈출하면 총 7의 minimum cost가 발생한다. 이 경우에는 1과 2 사이에 있는 간선을 선택하고, 1과 2의 정점 중 한 개의 비상탈출구를 만든다. 3은 탈출 할 수 있는 방법이 없기 때문에, 무조건..

[Python 3] LEETCODE 4 Median of Two Sorted Arrays

최근, LEETCODE라는 웹 사이트에서 알고리즘 공부를 하고 있다. 백준 온라인 저지는 조금 "구현"적인 느낌이 강하고, 문제에 미사여구 (재미를 주는 부분) 또한 많다. 한국어로 이루어져 있기에 조금 더 문제 읽기가 좋다. 그러나 Leetcode에서는 이 보다는 알고리즘 그 자체를 더욱 강하게 다루는 느낌이다. 같은 알고리즘이라고 하더라도, 분명히 문제가 주는 느낌이 다르다. 결코 같은 문제를 푼다는 느낌이 안 든다. 조금 더 코딩 인터뷰나, 이해도를 키우기 위해서는 반드시 Leetcode도 풀어봐야겠다, 라는 생각을 했다. 아직까지 풀었던 Leetcode 문제는 Easy나 Medium 난이도였는데, 처음으로 Hard 난이도를 자랑하는 문제를 마주쳤다. 번역을 해보자면, 2개의 정렬된 배열 nums1..