본문 바로가기

728x90

CS Study/Algorithm(Coding Test)

(21)
[BOJ] 7576. 토마토 (Python) 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 오랜만에 보는 토마토 문제~! 정말 대표적인 BFS 문제라고 할 수 있다. from collections import deque def solution() : M, N = map(int, input().split()) dxy = [(0, 1), (0, -1), (1, 0), (-1, 0)] # 이동 방향 q = deque([]) tomatoes = [] for row in range(N) : tomato = list(map(int, input()..
[Programmers] 타겟 넘버 (Python) 코딩테스트 연습 - 타겟 넘버 n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 programmers.co.kr 예전에 풀었던 BFS / DFS를 오랜만에 다시 풀어봤다! 주어진 숫자로 타겟 넘버를 만드는 방법이 몇가지 있는지 세보는 문제이다. 이때 주어진 숫자의 순서는 바꿀 수가 없다! 방법은 간단하다. 앞에서부터 순서대로 더하거나 빼는 케이스를 해보고, 타겟 넘버가 되는 케이스를 세어주면 된다. 1) BFS 풀이 def bfs(start) : answer = 0 q = deque([]) q.append((numbers[start], start))..
[Programmers] 2019 카카오 개발자 겨울 인턴십 - 튜플 (Python) 코딩테스트 연습 - 튜플 "{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1] programmers.co.kr 문자열 다루는 문제! 집합 길이별로 정렬해서 새로 추가 된 숫자를 순서대로 정답 리스트에 넣어주면 된다!! def solution(s): answer = [] s = s[1:-1] # 대괄호 제거 s = ''.join(s.split('{')).split('}')[:-1] # 집합 분리 set_dict = dict() # 길이 별 집합 저장 for i in s : if i[0] == "," : i = i[1:] ..
[Programmers] 큰 수 만들기 (Python) 코딩테스트 연습 - 큰 수 만들기 programmers.co.kr 오랫동안 못 풀었던 큰 수 만들기 문제! 오랜만에 도전했더니 생각보단(?) 금방 해결해서 기분이 좋다! 그리디 = 매 순간 최선의 선택을 하는 문제! 라는 것에 집중하면 문제 해결방법을 금방 생각해낼 수 있다. 가장 큰 수를 만들기 위해서 매 순간 할 수 있는 가장 최선의 선택은 무엇일까? 큰 수의 조건은 무엇인가!? 일단 큰 수가 되려면 무조건 맨 앞자리 숫자가 가장 커야한다. 따라서 앞에서부터 비교했을 때 현재 자릿수 숫자 < 다음 자릿 수 숫자 이면 현재 자릿수의 숫자를 제거하는 것이 바람직하다는 것! 또한 제거하고나서 매번 처음부터 다시 비교하면 시간초과가 나므로 제거한 숫자 전 바로 이전 자릿수부터 다시 비교해야한다. 이전 자릿수..
[Programmers] 이진 변환 반복하기 (Python) 코딩테스트 연습 - 이진 변환 반복하기 programmers.co.kr 주어진 이진 숫자에서 0을 제거하고, 제거한 숫자의 길이를 다시 이진 변환하고.. 숫자가 1이 될 때까지 이 과정을 반복하는 문제이다! 1이 될 때까지 몇 개의 0을 제거했고, 몇 단계를 거쳤는지 리턴해주면 끝! def solution(s): answer = [] cnt = 0 # 제거한 0의 개수 step = 0 # 회차 while s != "1" : step += 1 new_s = len(''.join(s.split("0"))) cnt += len(s) - new_s s = "" while new_s != 1 and new_s != 0 : s = str(new_s % 2) + s new_s //= 2 s = str(new_s) +..
[Programmers] 스킬트리 (Python) 코딩테스트 연습 - 스킬트리 programmers.co.kr 스킬 트리에서 선행 스킬 조건을 제대로 만족한 스킬트리의 개수를 찾는 문제! 오랜만에 게임이 하고 싶어지는 문제였다ㅋㅋ 처음에는 선행 스킬 조건을 Parents 테이블로 찾아야 하나 했는데 생각해보니 단계 순서를 정확하게 따르지 않으면 무조건 틀리기 때문에 그냥 순서를 지켰느냐만 확인하면 되는 문제였다. 1. 각 스킬 레벨 정리 주어진 선행 스킬 순서대로 딕셔너리 형태로 0, 1, 2, ... 순으로 레벨을 매겨주었다. 2. 각 스킬 트리하나씩 살펴보며 선행 스킬 지켰는가 확인 i) 만약 선행스킬이 없는 스킬이라면 순서가 상관없으니 확인할 필요가 없음 ii) 선행 스킬이 있다면(스킬 딕셔너리에 존재한다면) 내가 현재 배울 수 있는 스킬인지 확인..
[Programmers] 피로도 (Python) 코딩테스트 연습 - 피로도 XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던 programmers.co.kr 던전의 개수가 8개밖에 되지 않아 permutations로 간단하게 풀었다. from itertools import permutations def solution(k, dungeons): answer = -1 n = len(dungeons) # 던전 갯수 for perm in list(permutations(range(0, n), n)) : cnt = 0 now_k = k for i in perm : if now_k >= dungeons[i][0] : n..
[Programmers] 124 나라의 숫자 (Python) 코딩테스트 연습 - 124 나라의 숫자 programmers.co.kr 1, 2, 4만 있는 나라에서 10진수를 어떻게 표현할 수 있는가? 라는 문제! 처음 딱 봤을 때 3진법으로 나타내고 0, 1, 2를 각각 매칭해주면 되겠네! 라고 간단하게 생각했다. 그러나 풀어서 생각해보니 0의 경우 단독으로 맨 앞자리에 올 수 없으므로 단순 매칭으로는 해결할 수 없다는 문제가 있었다! 숫자를 다 나열해서 비교해보며 찾아낸 규칙은 1. 3으로 나누어 떨어지지 않으면 3진법으로 나타낸 수를 그대로 사용하고 2. 3으로 나누어 떨어지는 경우 4를 대신 넣어주고, n // 3 -1 에서 이어서 계산을 해주면 된다. 이렇게 두 가지였다! 이러한 규칙만 찾아내면 간단하고, 입력으로 주어지는 숫자가 아무리 커도 시간 효율성도..

728x90