티스토리 뷰
알고리즘 문제를 풀다보면 2차 이상 배열의 탐색을 위해 다중 반복문을 쓰는 경우가 많습니다. 예를들어 아래와 같은 경우입니다.
1 2 3 4 5 6 7 | int[][] arr = new int[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ } } |
간단한 예제로 위의 2차 배열에서 1을 찾았을 경우 전체 반복문을 빠져나오는 코드를 작성해 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | int[][] arr = new int[n][n]; boolean flag = false; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(arr[i][j]==1){ flag = true; break; } } if(flag) break; } |
boolean형 변수 flag를 선언하여 1을 발견했을 시에 flag의 값을 바꿔준 후 안쪽 반복문을 빠져나온 뒤 다시 flag 변수를 확인해서 바깥쪽 반복문의 break 처리를 해주었습니다.
방법이 잘 못 된것은 아니지만 Java에서는 좀 더 편하게 다중 반복문을 빠져나올 수 있는 방법이 있습니다. goto 문을 이용하는 법도 있지만 권장 사항은 아니므로 반복문에 라벨(Label)을 붙여 즉, 반복문에 이름을 부여하여 다중 반복문을 빠져나올 수 있습니다.
위의 예제에서 첫 번째 반복문에 xx란 라벨을 부여해보겠습니다.
1 2 3 4 5 | xx: for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ } } |
첫 반복문 앞쪽에 '(이름):' 을 붙여주면 라벨이 부여되어 이제 저 반복문을 xx로 부를 수 있게됩니다. 그렇다면 이 라벨 붙인걸 어떻게 써먹을 수 있을까요? 마찬가지로 1을 찾을경우 전체 반복문을 빠져나가는 코드를 작성해 보겠습니다.
1 2 3 4 5 | xx: for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(arr[i][j]==1) break xx; } } |
아주 간단하게 break xx;를 통해서 '1을 찾았을경우 가장 바깥쪽 반복문인 라벨이 xx를 빠져나가라' 라는 코드를 작성할 수 있습니다. 마찬가지로 다중 반복문에서 안쪽 내용을 무시하고 다시 위로 돌아가고 싶을 경우 continue 문도 이용 가능합니다.
1 2 3 4 5 | xx: for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(arr[i][j]==1) continue xx; } } |
위와 같이 continue 문도 정상적으로 작동이 됩니다.
flag 변수를 이용해서 작성하는것도 좋지만 문제를 풀때는 시간적인 문제도 있으므로 이해할 수 있는 범위에서 최대한 간결히 작성하는게 좋다고 생각하므로 앞으로 라벨을 적극적으로 사용할 것 같습니다.
'알고리즘 > 공부' 카테고리의 다른 글
[Java] 배열로 Stack을 구현해보자! (0) | 2019.02.26 |
---|---|
[Java] 배열로 Queue를 구현해보자! (0) | 2019.01.31 |
[Java] 비트 마스크에 대해서 알아보자 (0) | 2018.10.16 |
[백준] 10828번 스택 (0) | 2018.08.30 |
- Total
- Today
- Yesterday