Menu
Coddy logo textTech

중첩 루프 탈출하기

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 2번째.

중첩된 루프를 작업할 때, 일반적인 break 문은 가장 안쪽의 루프만 빠져나옵니다. 하지만 Go는 외부 루프를 직접 빠져나올 수 있게 해주는 레이블(label)을 제공하여, 복잡한 루프 구조를 정밀하게 제어할 수 있게 해줍니다.

레이블은 루프 앞에 배치하는, 콜론이 뒤따르는 식별자입니다. 그런 다음 break 뒤에 레이블 이름을 사용하여 중첩된 루프 내에서도 해당 특정 루프를 종료할 수 있습니다.

outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if i == 1 && j == 1 {
            break outer
        }
        fmt.Printf("i=%d, j=%d\n", i, j)
    }
}

이 예제에서, i == 1 && j == 1 조건이 충족되면, break outer는 내부 루프와 외부 루프를 모두 즉시 종료합니다. 이는 원하는 항목을 찾은 후 검색을 완전히 중단하고자 하는 2D 데이터 구조를 검색할 때 특히 유용합니다.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

challenge icon

챌린지

쉬움

이 챌린지에서는 레이블이 지정된 break 문을 사용하여 2D 그리드를 검색할 때 중첩된 루프를 종료하는 연습을 합니다. 그리드에서 특정 타겟 숫자를 찾아야 하며, 숫자를 찾는 즉시 검색을 중단해야 합니다.

두 개의 입력을 받게 됩니다:

  • "rows,cols" 형식의 그리드 크기를 나타내는 문자열 (예: "3,4")
  • 검색할 타겟 숫자를 나타내는 문자열 (예: "7")

다음과 같은 숫자로 구성된 2D 그리드가 제공됩니다:

grid := [][]int{
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
}

당신의 과제는 다음과 같습니다:

  1. 첫 번째 입력에서 차원(dimensions)을 파싱하여 검색할 행과 열의 수를 결정합니다.
  2. 두 번째 입력에서 타겟 숫자를 파싱합니다.
  3. 레이블이 지정된 break와 함께 중첩 루프를 사용하여 그리드를 검색합니다.
  4. 타겟 숫자를 찾으면, "Found [target] at position ([row], [col])"를 출력하고 레이블이 지정된 break를 사용하여 즉시 두 루프를 모두 종료합니다.
  5. 타겟을 찾지 못하고 검색을 마친 경우, "Target [target] not found"를 출력합니다.

위치는 0부터 시작하는 인덱스(첫 번째 행은 0, 첫 번째 열은 0)를 사용하여 보고해야 합니다.

치트 시트

레이블을 사용하면 중첩된 루프 내부에서 외부 루프를 빠져나올 수 있습니다. 레이블은 루프 앞에 위치하며 식별자 뒤에 콜론이 붙는 형태입니다.

outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if condition {
            break outer  // 두 루프를 모두 종료합니다
        }
    }
}

break 뒤에 레이블 이름을 사용하여 깊게 중첩된 구조에서도 특정 루프를 종료할 수 있습니다. 이는 2D 데이터를 검색할 때 대상을 찾으면 즉시 전체 검색을 중단하고 싶을 때 유용합니다.

직접 해보기

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    // 입력 읽기
    var dimensions string
    var targetStr string
    fmt.Scanln(&dimensions)
    fmt.Scanln(&targetStr)
    
    // 차원 파싱
    dimParts := strings.Split(dimensions, ",")
    rows, _ := strconv.Atoi(dimParts[0])
    cols, _ := strconv.Atoi(dimParts[1])
    
    // 대상 숫자 파싱
    target, _ := strconv.Atoi(targetStr)
    
    // 미리 정의된 그리드
    grid := [][]int{
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
    }
    
    // TODO: 아래에 코드를 작성하세요
    // 대상을 찾기 위해 레이블이 지정된 break와 함께 중첩 루프를 사용하세요
    
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 & 흐름의 모든 레슨