본문 바로가기

Study/Algorithm16

[Algorithm]Programmers_KAKAO_118667_두 큐 합 같게 만들기_Go 문제 설명 풀기 전 생각 1. 큐를 둥글게 이어 붙이면 링(Ring) 형태가 된다. 2. 투포인터를 사용하여 타겟 넘버를 찾는다. ∵ 큐는 Pop과 Push를 이용해 연속된 데이터 처리만을 할 수 있기에 투포인터를 사용해도 된다 판단. 3. 시나리오를 분리하여 큐를 만드는데 필요한 수행 횟수 계산. 시나리오 1. 시작 포인터와 끝 포인터가 같은 큐에 있다. i) 끝 포인터가 큐의 마지막 인덱스 값이다. ii) 끝 포인터가 큐의 마지막 인덱스 값이 아니다. 2. 시작 포인터와 끝 포인터가 다른 큐에 있다. 사용 자료구조 tmpq []int - 링 형태를 직접 구현하기보다 1번 큐, 2번 큐, 1번 큐를 이어 붙여 링 형태로 사용. 코드 package main import ( "fmt" "math" ) fu.. 2022. 8. 26.
[Algorithm] Programmers_42579_베스트앨범 - Go 문제 링크 Programmers_42579_베스트앨범 생각 1. 장르의 우선순위를 먼저 생각 2. 장르별로 노래의 우선순위를 생각 기본적으로 sort만을 사용해서도 풀이가 가능하지만 우선순위 큐를 체득하고 싶어서 우선순위 큐도 사용 코드 import ( "container/heap" "fmt" "sort" ) type genre struct { name string playAmount int } type song struct { index int playCount int } type pq []song func (p pq) Len() int { return len(p) } func (p pq) Less(i, j int) bool { if p[i].playCount == p[j].playCount { ret.. 2022. 6. 13.
[Algorithm]BOJ_18809_앱 - Go 문제 링크 BOJ_18809_앱 생각 생각해야 할 값이 2개다. 돌려받는 메모리와 리턴에 대한 오버헤드. dp를 사용하는 가방 알고리즘을 떠올렸다. 코드 package main import ( "bufio" "fmt" "os" ) var memories, returnVal []int var table [][]int var returnValMax int func main() { r := bufio.NewReader(os.Stdin) var N, M int fmt.Fscan(r, &N, &M) memories = make([]int, N+1) returnVal = make([]int, N+1) for i := 1; i 2022. 5. 9.
[Algorithm] BOJ_18809_Gaaaaaaaaaarden - Go 오래간만에 Go를 사용해 통해 알고리즘을 풀어보았다. 감을 살리기 위해 적당한 난이도처럼 보이는 구현 문제를 건드려보았는데.. 쒯.. 내가 너무 어렵게 생각했을 수도 있지만 정말 다양한 것들을 엮어서 푼 것 같다.(뿌듯함 :D) 문제 링크 BOJ_18809_Gaaaaaaaaaarden 코드 package main import ( "bufio" "fmt" "os" ) type queue struct { data []pos } type pos struct { x, y int } func (q *queue) pop() pos { if len(q.data) == 0 { return pos{} } val := q.data[0] q.data = q.data[1:] return val } func (q *queue).. 2022. 4. 29.
[Algorithm] Programmers_42579_베스트 앨범_Go Go 우선순위큐 연습 package q42579 import ( "container/heap" "fmt" ) type Genre struct { name string amount int } type Song struct { num int cnt int } type sPQ []*Song func (s sPQ) Len() int { return len(s) } func (s sPQ) Less(a, b int) bool { if s[a].cnt == s[b].cnt { return s[a].num s[b].cnt } func (s sPQ) Swap(a, b int) { s[a], s[b] = s[b], s[a] } func (s *sPQ) Push(x i.. 2021. 10. 13.
[Algorithm]Programmers_월간코드챌린지_86052_빛의 경로 사이클_Go 링크 링크 : 빛의 경로 사이클 풀이 방법 문제 설명 빛이 "S"가 써진 칸에 도달한 경우, 직진합니다. 빛이 "L"이 써진 칸에 도달한 경우, 좌회전을 합니다. 빛이 "R"이 써진 칸에 도달한 경우, 우회전을 합니다. 빛이 격자의 끝을 넘어갈 경우, 반대쪽 끝으로 다시 돌아옵니다. 예를 들어, 빛이 1행에서 행이 줄어드는 방향으로 이동할 경우, 같은 열의 반대쪽 끝 행으로 다시 돌아옵니다. 생각해야 할 것 주어진 칸을 생각하며 간단히 좌회전, 우회전을 할 방법을 생각해 낸다. 0 : 위, 1 : 오른쪽, 2 : 아랫쪽, 3 : 왼쪽 으로 지정하여 기존의 방향에서 우회전일 경우 +1, 좌회전일 경우 -1을 해 방향을 지정해 준다. 격자의 범위를 지나칠 때 반대쪽에서 다시 나타나는 방법을 생각해 낸다. p.. 2021. 10. 1.