알고리즘 134

[프로그래머스 - Python] 154538 - 숫자 변환하기

0. 문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/154538 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. 풀이 방법 DP를 이용해서 문제를 풀었다. 조금 더 최적화를 하기 위해서 for loop의 범위에도 제한을 주었고, 아래의 조건에도 제한을 주었다. BFS로 풀까 잠시 고민했는데, x = 1이고, y = 1,000,000이고, n = 1일 경우에 제일 빠른 경우는 19번이다. 첫 번째 단계에서 3개, 두 번째 단계에서 3^2개.... 19번째 단계에서는 3^19개.. 가 생..

[프로그래머스 - Python] 154540 - 무인도 여행

0. 문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/154540 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. 풀이 방법 이중 for loop를 사용하여, 모든 맵을 훑는다. 이때 무인도인데, 방문한 적이 없다면 BFS를 통해 연결된 무인도를 찾고, 먹을 수 있는 모든 음식을 찾는다. 이를 append 하고, 반환은 정렬해서 반환하도록 한다. 2. 코드 from collections import deque def solution(maps): def bfs(y, x): food = i..

[프로그래머스 - Python] 67257 - 수식 최대화

0. 문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/67257 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. 풀이 방법 우선 입력으로 들어오는 수식을 +, -, *로 쪼개서 저장을 해야 한다. 이를 위하여 re를 사용했다. 또한 우선순위를 위해서는 모든 경우의 수를 따져야 하는데, 이를 위해서 itertools.permutations를 사용했다. eval을 통해서 문자열인 수식을 계산하고, 다시 방정식에 넣는 방식으로 문제를 해결했다. 이때 whlie문을 사용해서 인덱스를 조절했는데..

[프로그래머스 - Python] 42583 - 다리를 지나는 트럭

0. 문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/42583 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. 풀이 방법 이 문제는 deque를 사용하여, 실제 다리와 트럭의 움직임을 구현하면 된다. 만약 새로운 트럭이 올라갈 수 없는 상태라면. 0을 append 함으로써 빈 공간을 표현한다. 2. 코드 from collections import deque def solution(bridge_length, weight, truck_weights): answer = 0 dq = dequ..

[프로그래머스 - Python] 86052 - 빛의 경로 사이클

0. 문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/86052 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. 풀이 방법 일단 문제에서 체크해야 되는 요소가 방향, 위치, 다음 경로이다. 사실 방향, 위치, 다음 경로는 구현의 영역이기 때문에 개인 역량에 따라 달라진다. 아무튼 우리는 사이클을 확인해야 하는데, 나는 추가적으로 check를 사용해서 해결했다. check는 [y 좌표][x 좌표][4방향]으로 확인하는데, 특정 좌표에서 특정 방향으로 간 적이 있다면 True로 표시한다. ..

[프로그래머스 - Python] 138476 - 귤 고르기

0. 문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/138476 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. 풀이 방법 당연하게도 서로 다른 종류의 수가 가장 적게 박스에 넣는 방법은 같은 종류를 최대한 많이 넣는 방법이다. 그러면 중복되는 귤의 개수를 세야 하는데, 이를 위해서 Counter를 사용했다. Counter를 정렬하고, 반복문을 사용해서 박스에 빈 공간이 없도록 채워주면 된다. 2. 코드 from collections import Counter def solution(..

[백준 - Python] 2638 - 치즈

0. 문제 링크 https://www.acmicpc.net/problem/2638 2638번: 치즈 첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 www.acmicpc.net 1. 풀이 방법 문제에서는 맨 가장자리엔 치즈가 없다라고 되어있다. 따라서 BFS의 시작은 맨 가장자리인 [0][0]에서 시작한다. 치즈와 인접한 공기를 체크하기 위해 adjCheck를 사용했다. 해당 리스트는 치즈와 인접한 공기의 개수를 체크한다. 공기의 중복 방문 처리를 위하여 airCheck를 사용했다. 해당 리스트는 공기가 이미 방문한 곳을 처리한다. 결론적으로..

[백준 - Python] 3190 - 뱀

0. 문제 링크 https://www.acmicpc.net/problem/3190 3190번: 뱀 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임 www.acmicpc.net 1. 풀이 방법 나는 맵에다가 직접 뱀의 몸을 그려서 해결하였다. 사과가 있는 곳은 0, 뱀이 있는 곳은 1, 빈 공간은 -1로 처리하였다. dict를 사용해서 특정 시간의 뱀의 위치 전환을 표시했다. -> 0~3까지의 인덱스로 관리하였음. R이면 인덱스 += 1 뱀의 머리가 방향을 전환했다 하더라도, 꼬리는 나중에 전환하므로, 꼬리의 방향 전환을 위한 tailMove를 추가로 생성해 준..

[백준 - Python] 1039 - 교환

0. 문제 링크 https://www.acmicpc.net/problem/1039 1039번: 교환 첫째 줄에 정수 N과 K가 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, K는 10보다 작거나 같은 자연수이다. www.acmicpc.net 1. 풀이 방법 완전 탐색 비슷하게 풀었다. 참고로 BFS이다. 다만 최대 10억 개를 탐색해야 하는데, 이렇게 하면 무조건 시간초과가 난다. 최대 1,000,000의 길이이지만, 각 위치의 숫자는 0~9이다. 따라서 무조건 중복이 발생한다. 그러므로 중복을 잘 체크한다면 빠르게 풀 수 있다. BFS를 할 때는 실제로 자리를 바꿔줘서 해결하면 된다. *참고로 string끼리 대소비교 가능하다. 2. 코드 import sys from collection..

[백준 - Python] 2812 - 크게 만들기

0. 문제 링크 https://www.acmicpc.net/problem/2812 2812번: 크게 만들기 N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오. www.acmicpc.net 1. 풀이 방법 while(특정 숫자가 들어오면 스택의 앞선 숫자와 비교한다.) 이때 들어오는 숫자가 더 크다면 스택을 팝한다. (k에 1씩 빼면서) 위 방식을 사용하면 앞자리가 큰 순서대로 스택에 쌓인다. 반복문을 탈출했는데, k가 0이 아니라면 이는 숫자가 대체적으로 내림차순이라는 의미이므로 스택에서 앞의 n - k개의 숫자를 출력한다. 2. 코드 import sys input = sys.stdin.readline def sol(): n, k = map(..