12. [Java] 옹알이(1): break vs continue
1. 문제 요약
- https://school.programmers.co.kr/learn/courses/30/lessons/120956
- 프로그래머스 옹알이(1)
- 머쓱이의 조카가 발음할 수 있는 단어의 개수 찾기
2. 전체 코드
import java.util.*;
class Solution {
public int solution(String[] babbling) {
String[] canSay = {"aya", "ye", "woo", "ma"};
int count = 0;
for (String word : babbling) {
String temp = word;
boolean isValid = true;
for (String say : canSay) {
// 중복된 발음이 있는지 확인
if (temp.contains(say + say)) {
isValid = false;
break;
}
}
if (!isValid) continue;
// 발음 가능 단어 제거
for (String say : canSay) {
temp = temp.replace(say, " ");
}
// 모두 제거되었는지 확인 (공백만 남은 경우 trim()으로 제거)
if (temp.trim().isEmpty()) {
count++;
}
}
return count;
}
}
3. 같은 단어 중복인지 확인하는 코드
if (temp.contains(say + say)) {
isValid = false;
break;
}
- 이 코드는 같은 단어가 두 번 연속 사용된 문자열을 걸러내기 위해 사용된다.
- 조카는 "ayaaya"처럼 같은 단어를 두 번 연속 발음하지 못하기 때문이다.
- 그래서 "ayaaya", "mama", "woowoo" 같은 경우는 불가능한 발음이다.
- 예르 들어, say = "aya" 라고 할 때 say + say는 "ayaaya"이다.
- temp.contains("ayaaya")는 temp 문자열 안에 "ayaaya"가 들어 있는지를 확인한다.
4. continue
- isValid가 false일 경우 → 이 단어는 조카가 말할 수 없는 단어이므로 아래 로직은 더 이상 실행하지 않고, 다음 단어로 넘어감
- 반복문 안에서 continue는 현재 반복을 중단하고 다음 반복으로 건너뜀을 의미한다.
for (String word : babbling) {
// 어떤 조건으로 유효한 발음인지 검사
if (!isValid) continue;
// 여기 있는 코드는 건너뜀!
}
- !isValid가 true이면, 즉 isValid == false이면
- → 현재 word는 조건에 맞지 않으니까
- → 아래 replace 등의 처리를 하지 않고
- → 바로 다음 word로 넘어감.
5. break
- break의 역할: "반복문 하나만 탈출"해서 즉시 종료
- 이중 루프 중에 안쪽에 있으면 그 안쪽 루프만 빠져나온다.
for (String say : canSay) {
if (temp.contains(say + say)) {
isValid = false;
break; // ✅ 이 for 루프를 빠져나옴!
}
}
여기서 break;는 바로 canSay 배열을 순회하는 for문을 탈출한다.
따라서 그 다음 실행되는 건 → continue; 실행됨 → 이 단어는 skip하고 다음 단어로 넘어가는 로직이 실행된다.
if (!isValid) continue;
6. continue VS break
for each word in babbling:
for each say in canSay:
if word contains say+say:
isValid = false
break ← 여기서 안쪽 for문 탈출
if (!isValid) continue ← 이 줄로 와서 현재 word 스킵
- break :가장 가까운 반복문 전체를 탈출
- continue : 현재 반복을 건너뛰고, 다음 반복을 바로 실행