문제
- 컴퓨터가 랜덤으로 영어단어를 선택합니다.
- 영어단어의 자리수를 알려줍니다.
- ex ) PICTURE = 7자리 ⇒ _ _ _ _ _ _ _
- 사용자는 A 부터 Z 까지의 알파벳 중에서 하나를 입력합니다.
- 입력값이 A-Z 사이의 알파벳이 아니라면 다시 입력을 받습니다
- Java 의 Charactor.isLetter() 을 활용해보세요
- 입력값이 한 글자가 아니라면 다시 입력을 받습니다
- 이미 입력했던 알파벳이라면 다시 입력을 받습니다.
- 입력값이 정답에 포함된 알파벳일 경우 해당 알파벳이 들어간 자리를 전부 보여주고, 다시 입력을 받습니다.
- ex ) 정답이 eyes 인 경우에 E 를 입력했을 때
- _ _ _ _ → E _ E _
- ex ) 정답이 eyes 인 경우에 E 를 입력했을 때
- 입력값이 정답에 포함되지 않은 알파벳일 경우 기회가 하나 차감되고, 다시 입력을 받습니다.
- 입력값이 A-Z 사이의 알파벳이 아니라면 다시 입력을 받습니다
- 사용자가 9번 틀리면 게임오버됩니다.
- 게임오버 되기 전에 영어단어의 모든 자리를 알아내면 플레이어의 승리입니다.
알고리즘 설계
- 영단어 목록을 String 타입 배열 `words`에 저장
- Random()을 사용해서 임의의 영단어 하나를 String 타입 변수 `correctWord`에 저장
- length()로 문자열의 길이를 구해서 길이만큼 언더바 출력
- 반복문
- `inputLetter`가 2글자 이상 입력인 경우 try-catch문으로 예외 처리
- try -> Scanner로 char 타입 문자 입력받아서 char 타입 변수 `inputLetter`에 저장
- catch -> 잘못된 입력 안내 후 continue
- 조건문
- Charactor.isLetter()로 알파벳 입력인지 확인 후 알파벳이 아니면 continue
- `inputLetterLog`에 이미 존재하는 문자인지 반복하면서 확인 후, 이미 존재하면 continue
- else -> char 타입 배열 `inputLetterLog`에 저장
- `correctWord`와 `inputLetter`을 charAt으로 반복하면서 확인
- 동일한 문자가 있는 위치는 해당 문자 출력 / 그 외의 문자는 언더바 출력
- 동일한 문자가 없으면 count++
- count가 9인 경우 Game Over 출력 후 break
- `inputLetter`가 2글자 이상 입력인 경우 try-catch문으로 예외 처리
변경 사항
1. Scanner 객체는 char 타입으로 입력 ❌
`scanner.next().charAt(0)`으로 코드를 작성하면 문자열로 입력받아도 결과적으로 한 글자만 입력받은 것처럼 사용할 수 있다.
하지만 문제 자체가 한 글자가 아닌 경우 다시 입력받도록 하는 시스템이기 때문에, 문자열로 입력받고 조건문을 추가해야겠다.
2. inputLetterLog에 이미 존재하는 문자인지 확인 후 continue 대신 flag 사용
문자를 맞히기 위한 반복문 안에서 inputLetter와 inputLetterLog를 순서대로 비교하는 반복문을 중첩으로 사용했다.
중첩된 반복문 안에서 continue를 사용하면 inputLetterLog의 다음 인덱스로 넘어가는 로직이 되기 때문에, 내 의도대로 다음 입력을 받기 위한 continue가 될 수 없다.
따라서 inputLetterLog와 inputLetter의 데이터 중복 여부를 알 수 있는 flag를 만들고, 이 flag값을 조건으로 줘서 입력값을 inputLetterLog에 저장하도록 수정하자.
3. 시도 횟수를 나타내는 count 변수를 반복을 진행하면서 증가시키는 대신 감소시키기
처음 초기화할 때 가능한 시도 횟수를 지정해주는 게, 추후 시도 횟수를 변경하는 상황에서 수정이 편리할 것 같다.
4. underBarCnt , letterCnt 변수 추가
`correctWord`의 어떤 위치에도 `inputLetter`값이 없는 상황을 판단하기 위해
`correctWord`와 `inputLetter`을 charAt으로 반복하는 과정에서, 언더바를 출력할 때 변수 `underBarCnt`를 증가시킨다.
그리고 `correctWord`의 문자열 길이와 `underBarCnt`가 같으면 시도 횟수를 증가시킨다.
정답을 맞힌 경우 시스템을 종료하기 위해
`correctWord`와 `inputLetter`을 charAt으로 반복하는 과정에서, 문자를 출력할 때 변수 `letterCnt`를 증가시킨다.
5. count 변수명을 tryCount로 변경
underBarCnt와의 혼동 방지
6. 정답을 맞힌 경우 시스템을 종료하는 코드 추가
모든 인덱스의 문자를 맞혀도 계속 진행되는 논리적 오류 발생
추가한 `letterCnt` 변수의 값이 정답 문자열의 길이와 같으면 종료하는 코드를 추가하자
최종 실행 과정
1. 영단어 목록을 String 타입 배열 `words`에 저장
2. Random()을 사용해서 임의의 영단어 하나를 String 타입 변수 `correctWord`에 저장
Random random = new Random();
String correctWord = words[random.nextInt(15)];
3. length()로 문자열의 길이를 구해서 길이만큼 언더바 출력
for (int i = 0; i < correctWord.length(); i++) {
System.out.print("_");
}
4. 반복문
- 조건문
- `inputLetter`가 2글자 이상 입력인 경우 continue
- Charactor.isLetter()로 알파벳 입력인지 확인 후 알파벳이 아니면 continue
- `inputLetterLog`에 이미 존재하는 문자인지 반복하면서 확인 후, 이미 존재하면 디폴트가 false였던 `isDuplicate` 변수를 true로 변경
- `isDuplicate`가 false인 상황에서만 `inputLetterLog`에 입력값 저장
String inputLetter = scanner.next();
// 입력값이 한 글자가 아니면 다시 입력
if (inputLetter.length() != 1) {
continue;
}
// 입력값이 알파벳이 아니면 다시 입력
if (!Character.isLetter(inputLetter.charAt(0))) {
continue;
}
boolean isDuplicate = false;
// 입력값이 inputLetterLog에 있는지 확인
for (String string : inputLetterLog) {
if (string.equals(inputLetter)) {
isDuplicate = true;
}
}
// 이전에 입력하지 않은 값만 저장
if(!isDuplicate){
inputLetterLog.add(inputLetter);
}
- `correctWord`와 `inputLetter`을 charAt으로 반복하면서 확인
- 동일한 문자가 있는 위치는 해당 문자 출력
- 그 외의 문자는 언더바 출력 후 underBarCnt++
- `correctWord`의 길이와 `underBarCnt`가 같으면(어떤 위치에도 입력한 문자가 없으면) tryCount--
for(int i=0; i<correctWord.length();i++){
if(correctWord.charAt(i)==inputLetter.charAt(0)){
System.out.print(inputLetter);
letterCnt++;
}
else{
System.out.print("_");
underBarCnt++;
if(correctWord.length()==underBarCnt){
tryCount--;
}
}
}
- `tryCount`가 0인 경우 "Game Over" 출력 후 break
// tryCount가 0인 경우 Game Over
if(tryCount==0){
System.out.println("\nGame over!");
break;
}
- `letterCnt`가 `correctWord`의 길이와 값이 같은 경우 "You are win"과 `correctWord` 출력 후 break
// correctWord의 모든 인덱스를 맞힌 경우 시스템 종료
if(correctWord.length()==letterCnt){
System.out.println("\n" + correctWord);
System.out.println("You are win!");
break;
}
결과
☝️ if문 조건식의 반환값이 boolean인 경우
값이 true면 `!true`가 돼서 실행 X
값이 false면 `!false`, 즉 `true`가 돼서 실행 O
☝️ Character.isLetter(char)
값이 문자면 true
문자가 아니면 false 반환
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[백준][Java] 0 0이 입력될 때까지 연산 (0) | 2025.03.14 |
---|---|
[Java, Python] 배열의 평균값 (0) | 2025.03.06 |
[부트캠프][Java] ArrayList로 장바구니 구현하기 (0) | 2025.02.26 |
[부트캠프][Java] 좌표 출력하기 (0) | 2025.02.24 |
[백준][Java] 백슬래시 출력하기 (0) | 2025.02.22 |