오늘은 Golang의 Advent of Code 2024 2일차입니다. 이에 대한 저의 접근 방식과 솔루션을 살펴보겠습니다. 문제는 그리 쉽지는 않았지만 구현한 후에는 매우 간단했고 올바른 것으로 나타났습니다.
여기 GitHub에서 제 솔루션을 확인하실 수 있습니다.
보고서라는 줄이 주어졌는데, 각 보고서에는 여러 레벨이 있습니다. 보고서의 요구 사항은 최소 1배 또는 최대 3배만큼 엄격하게 증가하거나 감소해야 한다는 것입니다.
즉, 처음 두 요소가 1씩 증가하는 경우 해당 보고서의 다른 후속 요소는 1, 2 또는 3단계로 증가해야 하며 어떤 변경도 있을 수 없습니다(예: 인접한 두 요소의 변경이 0임). 숫자 또는 인접한 두 숫자가 같을 수 없음)
7 6 4 2 1 1 2 7 8 9 9 7 6 2 1 1 3 2 4 5 8 6 4 4 1 1 3 6 7 9
먼저 입력 구문 분석을 수행합니다. 매우 간단합니다. 개별 보고서를 얻으려면 n으로 분할해야 합니다. 이는 문자열이므로 ”7 6 4 2 1" , 슬라이스를 얻으려고 합니다. 정수입니다.
그러므로 개별 레벨(숫자)을 얻기 위해 공백/공백 " "으로 분할하고 이를 정수로 변환해야 합니다.
보고서의 개별 문자열(예: 레벨이 [“7”, “6”, “4”, “2”, “1”])이 있으면 이를 정수로 변환해야 합니다.
각각을 반복하여 정수로 변환하고 목록에 추가합니다.
목록을 구성한 후에는 배열의 배열이 될 보고서 목록에 추가합니다. 즉, 각 줄은 보고서이고 각 보고서에는 많은 수준이 있으므로 정수의 조각이 됩니다.
func SplitLevels(lines []string) [][]int { reportLevels := [][]int{} for i, reportLine := range lines { reportLevels = append(reportLevels, []int{}) for _, levelStr := range strings.Split(reportLine, " ") { level, err := strconv.Atoi(levelStr) if err != nil { log.Fatal(err) } reportLevels[i] = append(reportLevels[i], level) } } return reportLevels }
보고서와 레벨을 구성한 후에는 개별 보고서의 레벨 내 패턴을 실제로 분석합니다.
그러려면:
먼저 개별 보고서를 받아 처음 두 요소 간의 차이를 계산한 후 절대 차이를 주의 깊게 사용하는 것을 기억하세요.
보고서의 수준이 증가하는지 아니면 감소하는지를 나타내는 플래그를 유지해야 하며 이는 처음 두 요소로 확인할 수 있습니다.
즉, 처음 두 요소가 증가하면 후속 수준도 증가해야 하고, 요소가 감소하면 모든 수준도 감소해야 합니다.
먼저 가드 체크를 합니다. 그 차이가 0이거나 3보다 크거나 -3보다 작은 경우, 이는 안전 수준의 조건입니다. 그러한 경우 신고가 안전하지 않다는 false를 반환합니다.
이제 처음 두 요소 이후 보고서를 반복하고 플래그가 증가하는 것이 true이고 현재 차이가 0보다 작거나 같거나 이를 초과하는 경우 다음 두 수준 간의 차이를 계산합니다. 3 거짓으로 표시하기도 합니다
다른 조건은 플래그가 감소하는 경우입니다. 이는 처음 두 요소의 음의 차이가 있음을 의미하므로 현재 차이가 0보다 크거나 같은지 또는 -보다 작은지 확인합니다. 3, 그렇다면 거짓으로 표시합니다
모든 레벨에 대한 차이를 계산한 후 루프에서 벗어나면 레벨에 차이가 없으므로 true를 반환합니다.
7 6 4 2 1 1 2 7 8 9 9 7 6 2 1 1 3 2 4 5 8 6 4 4 1 1 3 6 7 9
2부에서는 몇 가지 작업을 수행해야 합니다. 보고서가 안전한지 여부를 계산해야 하며, 그것이 안전하지 않은 경우 보고서에서 요소 하나를 거의 제거하여 보고서를 안전하게 만들 수 있습니다.
이를 위한 접근 방식은 다음과 같습니다.
레벨의 불일치를 처음 본 인덱스를 가져옵니다
보고서에서 해당 요소를 제거하여 확인하고, 보고서가 안전해지면 true를 반환합니다. 즉, 안전한 보고서를 찾았습니다.
여전히 보고서가 안전하지 않다고 판단되면 불일치가 발견된 색인 이전의 요소를 제거하고, 해당 요소를 제거한 후에도 안전하다고 판단되면 안전하다고 표시합니다
그래도 보고서가 안전하지 않다고 판단되면 원래 불일치를 발견한 인덱스 뒤의 요소를 제거하고 보고서가 안전해지면 해당 보고서를 안전하다고 표시합니다
그렇지 않으면 보고서를 안전하게 만드는 제거 가능한 요소만 찾을 수 없으므로 보고서를 안전하지 않은 것으로 표시합니다.
func SplitLevels(lines []string) [][]int { reportLevels := [][]int{} for i, reportLine := range lines { reportLevels = append(reportLevels, []int{}) for _, levelStr := range strings.Split(reportLine, " ") { level, err := strconv.Atoi(levelStr) if err != nil { log.Fatal(err) } reportLevels[i] = append(reportLevels[i], level) } } return reportLevels }
여기 GitHub에서 제 솔루션을 확인하실 수 있습니다.
그것이 Golang에 코드 2024가 등장한 둘째 날의 매우 간단한 문제였습니다. Golang의 Advent of Code 2024 첫 번째 퍼즐에 대한 이 연습을 즐겼기를 바랍니다.
다른 흥미로운 해결 방법이 있거나 이에 대해 공유할 내용이 있으면 알려주시기 바랍니다. 피드백, 질문 또는 제안을 환영합니다.
읽어주셔서 감사합니다. 내일 3일차에 뵙겠습니다
행복한 코딩하세요 :)
위 내용은 Code n Golang의 출현: 슬라이싱 및 다이싱 보고서의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!