>백엔드 개발 >Golang >Code n Golang의 출현: 슬라이싱 및 다이싱 보고서

Code n Golang의 출현: 슬라이싱 및 다이싱 보고서

Patricia Arquette
Patricia Arquette원래의
2024-12-20 08:31:13229검색

소개

오늘은 Golang의 Advent of Code 2024 2일차입니다. 이에 대한 저의 접근 방식과 솔루션을 살펴보겠습니다. 문제는 그리 쉽지는 않았지만 구현한 후에는 매우 간단했고 올바른 것으로 나타났습니다.

여기 GitHub에서 제 솔루션을 확인하실 수 있습니다.

Advent of Code n Golang: Slicing and Dicing Reports 미스터 파괴자 / 출현_코드

코드의 출현

1부

보고서라는 줄이 주어졌는데, 각 보고서에는 여러 레벨이 있습니다. 보고서의 요구 사항은 최소 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부

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에서 제 솔루션을 확인하실 수 있습니다.

Advent of Code n Golang: Slicing and Dicing Reports 미스터 파괴자 / 출현_코드

코드의 출현

결론

그것이 Golang에 코드 2024가 등장한 둘째 날의 매우 간단한 문제였습니다. Golang의 Advent of Code 2024 첫 번째 퍼즐에 대한 이 연습을 즐겼기를 바랍니다.

다른 흥미로운 해결 방법이 있거나 이에 대해 공유할 내용이 있으면 알려주시기 바랍니다. 피드백, 질문 또는 제안을 환영합니다.

읽어주셔서 감사합니다. 내일 3일차에 뵙겠습니다

행복한 코딩하세요 :)

위 내용은 Code n Golang의 출현: 슬라이싱 및 다이싱 보고서의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.