개발지식 먹는 하마 님의 블로그
[사전캠프 8일차] _ 달리기반 문제풀이 완료 본문
달리기반 Java 문제풀이를 완료했다.
Java의 전체적인 내용을 전공책을 보며 한 번 정리하는 시간을 가지려고 했는데,
받은 강의 진도를 먼저 나가야 할 것 같아서 웹 개발 강의를 먼저 수강했다.
[오늘의 학습 키워드]
#Java실습 #웹개발
[학습 내용 정리]
웹 개발의 전반적인 내용에 대해 학습했다.
본격적으로 정리하기에는 시간이 부족해서 오늘은 여기에 간단한 내용만 적어보고자 한다.
<HTML+CSS+JavaScript>
웹 페이지를 구성하는 3요소이다.
HTML : 웹 페이지의 구조와 내용 = 뼈대
CSS : 웹 페이지의 모양 = 데코
JavaScript : 웹 페이지의 동적 변경 및 응용 프로그램 작성
(Java와 JavaScript는 인도와 인도네시아 같은 관계라는 설명이 인상적이었다.)
<웹 브라우저의 작동 원리>
API = 서버의 창구 같은 역할
브라우저가 주소를 통해 API로 요청을 보낸다.
API는 요청에 맞는 HTML 파일을 반환한다.
<디자인 똥손을 위한 빛과 소금, 부트스트랩!>
내가 프론트 엔드에 큰 흥미를 느끼지 못했던 이유는,
웹처럼 가독성 좋은 디자인에 적합한 미적감각이 부족했기 때문이다. (디자인을 못하는 건 아님)
아무리 시간과 공을 들여서 꾸며도 어딘가 난잡한 느낌이 드는 것 같고, 디자인이 어설퍼서 재미가 없었다.
어떨 때는 개발보다 디자인에 할애하는 시간이 더 많은 것 같아서 아깝게 느껴지기도 했다.
그.런.데 디자인 고민을 하지 않아도 된다고요? 감사합니다(꾸벅)
< Javascript >
- let
블록범위 변수이다.
같은 블록 내에서, 업데이트는 가능하지만 재선언은 불가능하다.
(ex, if문 안의 let test와 if문 밖의 let test는 별개이다.) - forEach
배열을 순회하며 각 요소를 콜백한다.
중간에 중단이 불가하다.
(ex, c++에서 vector test에 대해 for(auto t : test)로 호출한 것과 비슷한 원리이다.)
const numbers = [1, 2, 3, 4, 5];
numbers.forEach((number, index) => {
console.log(`Index: ${index}, Value: ${number}`);
});
[실습 코드]
< Lv3. 단어 맞추기 게임 >
단어를 주어진 기회 안에 맞추는 게임을 만들어보세요.
> 조건
- 랜덤으로 영어단어를 선택한다.
- 사용자로 부터 A-Z까지의 알파벡 중 하나를 입력받는다.
- 입력값이 A-Z 사이의 알파벳이 아니라면 다시 입력을 받는다.
- 입력값이 한 글자가 아니라면 다시 입력을 받는다.
- 이미 입력했던 알파벳이라면 다시 입력을 받는다.
- 입력값이 정답에 포함된 알파벳일 경우 해당 알파벳이 들어간 자리를 전부 보여주고,
다시 입력을 받는다.
- 입력값이 정답에 포함되지 않은 경우 기회가 하나 차감되고, 다시 입력을 받는다. - 사용자가 9번 틀리면 게임오버된다.
- 게임오버 되기 전에 영어단어의 모든 자리를 알아내면 플레이어의 승리이다.
> 고민한 부분과 풀이 방법
Q. 이전에 입력한 적이 있는 알파벳인지 아닌지 어떻게 판별할 것인가?
A. ArrayList를 사용해서 정상적으로 입력받은 알파벳들을 저장하고, 새로 입력받은 알파벳과 비교한다.(구글폼 제출 당시, 중복여부 확인 후에 alphabet.add(challenge); 코드를 추가하는 걸 빼먹어서 아래의 코드에는 추가했다.)
Q. 입력값이 정답에 포함된 알파벳일 경우, 해당 알파벳이 들어간 자리가 여러 개일 때, 이를 어떻게 처리할 것인가?
A. ArrayList<Integer>를 반환하는 함수를 사용했다. 전부 불일치하는 경우에는 첫 원소로 -1을 반환하고, 일치하는 경우에는 해당 위치를 List에 추가하도록 했다. 이후, 반환된 리스트에 저장된 위치에 따라 사용자에게 보이는 단어를 일부 변경했다.
> 코드
public class HangMan {
private static String[] dictionary = { "airplane", "apple", "belt", "broccoli", "cinema"};
//랜덤으로 단어 선정 함수
public String initWord() {
Random random = new Random();
int randNum = random.nextInt(5);
String randWord = dictionary[randNum];
return randWord;
}
//현재 단어 출력 함수
public void printWord(char[] word) {
System.out.println("-현재 단어-");
for(int i = 0; i < word.length; i++) {
System.out.print(word[i]+" ");
}
System.out.println();
}
//중복 사용 여부 비교
public boolean isBefore(ArrayList<String> alphabet, char ch) {
boolean result = false;
for(int i = 0; i < alphabet.size(); i++) {
if(alphabet.get(i).charAt(0) == ch) {
result = true;
break;
}
}
return result;
}
//알파벳이 일치하는 경우, 일치하는 위치 리스트를 반환한다.
//불일치 하는 경우, 반환되는 리스트의 첫 원소가 -1이다.
public ArrayList<Integer> compareAnswer(String answer, char ch){
ArrayList<Integer> result = new ArrayList<Integer>();
for(int i = 0; i < answer.length(); i++) {
if(answer.charAt(i) == ch) {
result.add(i);
}
}
if(result.isEmpty()) {
result.add(-1);
}
return result;
}
public static void main(String[] args) {
HangMan hangMan = new HangMan();
//사전 내의 단어 중 랜덤 단어 선택
String word = hangMan.initWord();
int wordLength = word.length();
char[] show = new char[wordLength];
for(int i = 0; i < wordLength; i++) {
show[i] = '_';
}
hangMan.printWord(show);
//종료조건 변수
boolean isNotOver = true;
int lifes = 9;
//이전에 시도한 적이 있는지 확인하기 위한 변수
ArrayList<String> alphabet = new ArrayList<String>();
Scanner input = new Scanner(System.in);
while(isNotOver){
System.out.println("남은 기회 : " + lifes);
System.out.println("A-Z 중 하나를 입력하세요");
String challenge = input.next();
char ch = challenge.charAt(0);
//입력값이 알파벳인가? 한글자인가? 이미 입력했던 알파벳이 아닌가?
if(Character.isLetter(ch)){
if(challenge.length() == 1) {
if(!hangMan.isBefore(alphabet, ch)) {
alphabet.add(challenge);
//입력값을 정답과 비교
ArrayList<Integer> compareResult = hangMan.compareAnswer(word, ch);
//입력값이 정답에 포함되지 않는 경우
if(compareResult.get(0) == -1) {
lifes--;
System.out.println("오답입니다.");
}
//입력값이 정답에 포함된 경우
else {
for(int i = 0; i < compareResult.size(); i++) {
int pos = compareResult.get(i);
show[pos] = word.charAt(pos);
hangMan.printWord(show);
}
}
}
}
}
//게임오버인가 성공인가
if(lifes <= 0 || String.valueOf(show).equals(word)) {
if(lifes <= 0) {
System.out.println("게임 오버");
}
else {
System.out.println("성공");
}
isNotOver = false;
}
}
input.close();
}
}
< Lv4. 가위 바위 보 >
5번의 가위바위보 게임을 해서 승리한 횟수 상당의 상품을 받아가는 게임을 만들어봐요.
> 조건
- 5번의 가위바위보를 진행한다.
- 사용자는 매 판마다 가위, 바위, 보 중 하나를 입력한다.
잘못된 입력은 '잘못된 입력입니다!'를 출력한다. - 컴퓨터는 가위, 바위, 보 중 랜덤하게 하나를 낸다.
- 매판마다 진행한 가위 바위 보의 승패에 대한 결과를 출력한다.
- 5판을 모두 마치면 승리한 횟수에 걸맞는 경품을 획득할 수 있다.
> 고민한 부분과 풀이
Q. 문자열로 입력받은 사용자의 패를 컴퓨터의 랜덤패와 어떻게 비교해야 간단하게 비교해서 승패를 가를 수 있을까?
A. 일단 가위, 바위, 보를 숫자 취급해서 비교하는 건 마음속에 딱 정하고 있었다.
경험상 나머지를 이용하면 좋을 것 같다는 직감이 들었다.
(user - com + 3)%3으로 음수가 아닌 결과를 반환하도록 하는 수식을 통해
일일이 문자열을 비교하지 않고도 간단히 문제를 해결했다.
> 코드
힌트를 의식하지 않고 풀려다 보니 마지막 경품에 대한 조건을 놓쳤다.
구글폼 제출 때, 이 부분이 빠졌고 현재는 이 부분까지 고려해서 코드를 작성했다.
package spartarunner;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
class Choice{
String name;
int type;
Choice(String name, int type){
this.name = name;
this.type = type;
}
}
public class RockPaperScissors {
Choice[] choices = {
new Choice("가위", 0),
new Choice("바위", 1),
new Choice("보", 2)
};
//사용자 입력값 확인하기
public int checkUserChoice(String input) {
int result = -1;
for(int i = 0; i < 3; i++) {
if(input.equals(choices[i].name)) {
result = choices[i].type;
}
}
return result;
}
//컴퓨터가 랜덤 수 선택
public int randomChoice() {
Random random = new Random();
int randNum = random.nextInt(3);
return randNum;
}
public static void main(String[] args) {
RockPaperScissors rockPaperScissors = new RockPaperScissors();
int times = 1;
int wins = 0;
Scanner input = new Scanner(System.in);
while(times <= 5) {
System.out.println(times + "회차 : 가위, 바위, 보 중 하나를 입력해주세요.");
String userChoice = input.nextLine();
int user = rockPaperScissors.checkUserChoice(userChoice);
if(user == -1) {
System.out.println("잘못된 입력입니다.");
}
else {
int computer = rockPaperScissors.randomChoice();
System.out.println("computer : " + rockPaperScissors.choices[computer].name);
int compare = (user - computer + 3) % 3;
if(compare == 1) {
wins++;
System.out.println("승리");
}
else if(compare == 2) {
System.out.println("패배");
}
else {
System.out.println("무승부");
}
times++;
}
}
input.close();
HashMap<Integer, String> gifts = new HashMap<>();
gifts.put(0, "꽝");
gifts.put(1, "곰돌이 인형");
gifts.put(2, "스파르타 랜드 입장권");
gifts.put(3, "스파르타 캐니언 항공 투어권");
gifts.put(4, "호텔 스파르타 숙박권");
gifts.put(5, "스파르테이트 항공권");
System.out.println("축하합니다! 총 " + wins + " 회 승리하여 경품으로 [" + gifts.get(wins) + "] 을 획득하셨습니다!");
}
}
[ 내일 학습 할 것 ]
1. 웹 개발 강의 완강하기.
'TIL' 카테고리의 다른 글
[사전캠프 10일차] _ DFS와 BFS 문제풀이 (0) | 2025.01.24 |
---|---|
[사전캠프 9일차] _ 그것이 알고 싶다(기존 카드가 보이지 않는 오류) (0) | 2025.01.23 |
[사전캠프 7일차] _ 오랜만에 만난 Java (1) | 2025.01.21 |
[사전캠프 6일차] _ SQL 실습 버닝! (0) | 2025.01.20 |
[사전캠프 5일차] _ 효율적인 SQL을 위하여 (0) | 2025.01.17 |