본문 바로가기

알고리즘 문제

프로그래머스 완주하지 못한 선수 p_dict에 참가자들 이름을 key로 하고 인원 수를 value로 하는 dict를 만든다. 완주한 선수 리스트를 돌면서 p_dict의 key로 접근해서 if문에서 안걸러지면 0이 아니라는 의미니까 1을 빼준다. p_dict를 돌면서 value가 0이 아니면 참가는 했지만 완주는 못한 사람이 key라는 의미이므로 key를 반환한다. def solution(participant, completion): p_dict = {} for p in participant: if p not in p_dict: p_dict[p] = 1 else: p_dict[p] += 1 for c in completion: if p_dict[c]: p_dict[c] -= 1 for i in p_dict: if p_dict[i] != ..
백준 2775번 부녀회장이 될테야 0층은 1~n호에 각 호에 대응되는 인원이 거주한다.각 층의 1호에는 1명만 산다. 1층의 2호는 0층의 1호와 2호를 합하면 된다. 배열로 표현하면 arr[1]+=arr[0]이다. 0층부터 k층까지의 n호를 쭉 구하면 배열이 갱신되면서 각 층의 각 호에 사는 사람들이 나온다. 마지막으로 나온 배열의 마지막 인덱스에 있는 값이 찾고자 하는 값이 된다. 4층 1 6 21 56 126 3층 1 5 15 35 70 2층 1 4 10 20 35 1층 1 3 6 10 15 0층 1 2 3 4 5 1호2호 3호 4호 5호 t=int(input()) for i in range(t): k=int(input()) n=int(input()) arr=[j for j in range(1,n+1)] for l in range(..
백준 1193번 분수찾기 규칙을 찾기 위해 분수를 쭉 써서 늘어놓는다. 분자와 분모에 무슨 규칙이 있는데 분자에 있는 규칙만으로 답을 구할 수 있다.m=int(input()) n=3 i=1 if m==1: print(str(1)+'/'+str(1)) else: while True: mid=n*i+1 if mid==m: print(str(n)+'/'+str(1)) break elif mid-(n-1)
백준 1316번 그룹 단어 체커 문자를 검사하다가 바뀌는 지점에서 alpha 배열에 False를 넣는다. index는 아스키 코드 값으로 계산하는데 현재 문자를 아스키 코드로 바꾸고 97을 빼면 a는 0 b는 1 이렇게 된다. 두번째 for문에서 마지막 문자 검사를 제대로 못한다. 그래서 마지막 문자는 두번째 for문을 빠져나온 후 if문에서 걸리는지 확인한다. 마지막 문자가 이전에 나오지 않았다면 count 1 증가. n=int(input()) count=0 for i in range(n): s=input() length=len(s) alpha=[True]*26 for j in range(length): if alpha[ord(s[j])-97]!=False: if j
백준 2941번 크로아티아 알파벳 문장을 받고for문을 하나씩 돌면서 c,d,l,n,s,z 문자가 나오면 뒤에 남은 문자가 있는지 확인하고 남은 문자가 어떤 문자인지 판별하기를 반복하면서 count를 늘려준다. s=input() count=0 length=len(s) for i in range(length): if s[i]=='c': if i
프로그래머스 k번째 수 def solution(array, commands): result=[] for command in commands: arr = array arr=arr[command[0]-1:command[1]] arr.sort() result.append(arr[command[2]-1]) return result print(solution([1, 5, 2, 6, 3, 7, 4],[[2, 5, 3],[4, 4, 1], [1, 7, 3]])) https://programmers.co.kr/learn/courses/30/lessons/42748
★ 프로그래머스 섬 연결하기 크루스칼 알고리즘 크루스칼 알고리즘은 사이클을 만들지 않는 최소 비용의 간선을 선택하는 것이다. 초기에 각 노드마다 트리(집합)를 만들어주고 최소 비용의 간선을 연결하면서 집합의 수를 늘려간다. 최종적으로 하나의 트리가 완성되는데 여기에 쓰인 비용을 모두 합하면 최소비용이 된다. parent={}#각 노드의 부모 rank={}#트리의 노드 수 def make_set(v):#각 노드를 집합으로 만들기 parent[v]=v#일단 부모는 자기 자신 rank[v]=0# def findRoot(v): if parent[v]!=v:#부모가 자기 자신이 아니면 parent[v]=findRoot(parent[v])#최상위의 부모로 갱신 return parent[v]#부모가 자기 자신이라면 최상위이므로 반환 def union(r1,r2)..
프로그래머스 저울 시간 어떻게 시간을 줄여야하는지 생각이 안나 검색해서 방법을 찾음 변수 s의 초기값을 1이라고 하고 현재 무게가 s보다 크면 종료한다.가벼운 무게부터 s에 누적한다. s의 초기값이 1이므로 누적된 값보다 큰 값이 나오면 거기에 도달할 방법이 없다. for문이 종료되면 weight 배열의 모든 값의 누적보다 1 큰 값이 s에 있다. 그러므로 모든 무게 추를 사용해도 못구하는 최소 값이다. 바로 반환해주면 답이다.def solution(weight): weight.sort() length=len(weight) s=1 for i in range(length): if s