본문 바로가기

전체 글

[programmers] 방금 그 곡 로직 1. 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B이다. 따라서 #이 붙은 음을 바꿔준다.' 각 음은 1분에 1개씩 재생되는 것이기 때문에 하나의 영어로 바꿔준다. 2. m과 info(악보)에서 음을 바꿔주고, 재생시간을 구해 재생시간과 악보의 길이를 맞춰준다. 3. 최종 악보에 m이 포함되어 있으면 temp에 넣고, 포함되어있지 않으면 temp에 넣지 않는다. 4. temp가 최종적으로 만들어졌으면, - 조건이 일치하는 음악이 없을 때에는 "(None)"을 반환 (return None을 하는 바람에 실패했다.) - 조건이 일치하는 여러 음악이 있으면 1) 재생시간 제일 긴 제목 2) 재생시간 같으면 먼저 입력된 음악 return 코드 주의할 .. 더보기
[programmers] N진수 게임 로직 - 최대 16진수이므로 n진수 표현하기.(함수로 만든다) 문제에서 10~15는 A~F로 출력한다고 나와있다. 따라서 숫자는 최대 m* t까지 구하면 그 뒤는 구할 필요 없고, 이후 튜브의 순서만 가지고오면 답이 된다. 코드 주의할 점 1. ** 문제점 : result를 구할 때 n, t, m, p = 2, 4, 2, 1인 경우 답이 '0111'인데 내 코드로 하면 '01110'이 나온다. n진수로 변환하는 함수에서 마지막 total[j]가 포함이 되어 그런거같다. 16진수인 경우 십의자리 진수라 괜찮은것 같고 한자리 진수이면 이렇게 되는 것 같다. ** 해결책 : result갯수가 t개가 되면, 더이상 볼 필요가 없다. -> if len(result) == t: break 더보기
[programmers] 섬 연결하기 로직 1. 비용이 최소화되어야하므로 비용 기준으로 정렬시킨 후 연결된 지점들을 찾는다. 2. 정렬된 costs의 처음값의 시작점을 visit에 표시한다. visit을 확인하면서 시작점 또는 끝점이 지나간 경험이 있으면 연결하려 시도한다. 3. 만약 시작점, 끝점이 다 지나왔으면 그냥 넘기고, 한쪽만 지나왔으면 visit을 체크한 후, 비용을 더해준다. 4. 그냥 비용을 더해도 괜찮은 이유는 비용 기준으로 정렬했기때문! 코드 주의할 점 1. break를 작성해줘야하는 이유! -> break를 사용해야 for문이 끝나고 for문을 계속 새로 실행하면서 if visit and visit에 걸려서 continue로 else문에 도착한다. 1 2 1 2 3 2 1 2 3 2 3 2 -> break 사용하지 않으면.. 더보기
[programmers] 캐시 로직 도시 이름은 대,소문자를 가리지 않기 때문에 대문자 혹은 소문자로 통일해준다. LRU(Least Recently Used) 알고리즘 : 캐시의 사이즈는 한정 되어있기 때문에 캐시 사이즈가 꽉 찬 상태에서 새로운 캐시를 넣으려면 기존 캐시에 있던 데이터를 교체해야하는 데, 가장 오래전에 사용한 것을 제거하는 알고리즘 새로운 도시를 넣으면 +5이고, 만약 cacheSize가 찼다면, 가장 오래된 것을 빼내고 새로운 도시를 넣는다. cacheSize가 아직 다 차지 않았다면, 그냥 새로운 도시 넣기 기존에 있는 도시를 넣기 위해서는 +1하고, city의 index가 일치하는 값을 지운다.(기존에 있던도시 값을 빼내고 그 도시를 다시 넣는다) 코드 더보기
[programmers] 프렌즈4블록 로직 4개씩 터지는 부분을 찾아서 visit에 표시하고, 모두 다 표시가 되었으면 board를 돌면서 한번에 0으로 만들어버린다. (아니면 중복되는 부분을 알 수 없다.) 0으로 바뀐 부분을 채우기 (down함수) 계속 터지고, 내리는 것을 계속 반복하고, 기존 0갯수랑 바뀐 board에 있는 0의 갯수랑 같으면 멈춘다. 코드 주의할 점 1. down함수에서 제대로 값이 나오지 않았다. 푸는 방식은 많았지만, 처음에는 이렇게 풀었다. 이렇게 된다면 , bbd[x+zero][y] = value에서 인덱스 에러가 나고, zero_count를 함께 계산하게 되어 나중에 solution에서 계산하기가 힘들다. 더보기
[programmers] 폰켓몬 로직 종류를 나열시킨후, 반보다 갯수가 많으면 최대값은 반이고, 반보다 작으면 종류모두를 하나씩 가지면 되는 것이다. 코드 더보기
[programmers] 타겟넘버 로직 이렇게 진행된다고 생각하면, 처음에 1일 넣어두고, 1에서 +1, -1한 값을 넣는다. 이후 2, 0에서 +1, -1한 값을 넣는다. 코드 def solution(numbers, target): answers = [0] for number in numbers: temp = [] for answer in answers: temp.append(answer + number) temp.append(answer - number) answers = temp cnt = 0 for i in answers: if i == target: cnt += 1 return cnt 주의할 점 - 원래는 ['+', '-']조합으로 풀려고 했는데, 4개조합만 해도 5040개의 경우의 수가 나온다. 더보기
[programmers] 구명보트 로직 구명보트는 2명만 탈 수 있다. 사람이 결국 모두 다 보트를 타야하니까, 몸무게순으로 정렬한 후, 가장 몸무게 적은 사람(l)이랑 많은 사람(h)을 같이 태우려 해본다. 먄약 l + h가 limit보다 작으면 ok, 크면 h인덱스를 하나 줄여서 비교해본다. h인덱스가 l인덱스보다 클때 진행한다 코드 def solution(people, limit): # 최대 2명씩 탄다. people = sorted(people) # [40, 50, 60, 80] i = 0 j = len(people) - 1 cnt = 0 while i < j: if people[i] + people[j] 더보기