TIL) 오늘 배운 내용 정리

2024. 12. 9. 17:38코딩테스트 리뷰(프로그래머스)

Java 알아보기

더보기
더보기

내일 배움 캠프) 사전캠프의 Java 알아보기 내용

1) 반복문 연습하기 Part 1
public class Main {
    public static void main(String[] args) {
        for( int i = 1; i <= 100; i++) System.out.println(i);
    }
}
2) 반복문 연습하기 Part 2
public class Main {
    public static void main(String[] args) {
        for( int i = 1; i <= 100; i++) if( i % 2 == 0 ) System.out.println(i);
    }
}
3) 반복문 연습하기 Part 3
public class Main {
    public static void main(String[] args) {
        for (int i = 2; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                System.out.println(i + "*" + j + "=" + i * j);
            }
            System.out.println();
        }
    }
}

 

Lv1) 랜덤 닉네임 생성기

public class Main {
    public static void main(String[] args) {
        List<String> result = new ArrayList<>(3);
        String[] prefix1 = {"기절초풍", "멋있는", "재미있는"};
        String[] prefix2 = {"도전적인", "노란색의", "바보같은"};
        String[] nickname = {"돌고래", "개발자", "오랑우탄"};

        result.add(prefix1[(int) (Math.random() * 3) ]);
        result.add(prefix2[(int) (Math.random() * 3) ]);
        result.add(nickname[(int) (Math.random() * 3) ]);

        for (String s : result) {
            System.out.println(s);
        }
    }
}

 

참조 : https://priming.tistory.com/99

 

[Java] 난수 생성 및 범위 지정(Math.random, java.util.Random 사용)

자바에서 난수를 생성하는 방법은 대표적으로 Math.random() 메서드를 사용하는 방법, java.util.Random 클래스를 사용하는 방법 두가지가 있습니다. Math.random난수 생성 기본 사용법double random = Math.random

priming.tistory.com

 

 

Lv2) 스파르타 자판기

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> menu = new HashMap<>();
        menu.put("sider", 1700);
        menu.put("cola", 1900);
        menu.put("sickke", 2500);
        menu.put("eye of sol", 3000);

        previewMenu(menu);

        String item;
        String money;
        do {
            System.out.println("구매하실 음료를 입력해주세요.");
            Scanner sc = new Scanner(System.in);
            item = sc.nextLine();

            System.out.println("돈을 넣어주세요.");
            money = sc.nextLine();
        } while(item.isEmpty() || money.isEmpty());

        if (Integer.parseInt(money) < menu.get(item)) {
            System.out.println("돈이 부족합니다.");
        } else {
            System.out.println(Integer.parseInt(money) - menu.get(item));
        }
    }

    private static void previewMenu(Map<String, Integer> menu) {
        for( Map.Entry<String, Integer> a : menu.entrySet() ) {
            System.out.println(a.getKey() + ": " + a.getValue());
        }
    }
}

 

맵으로 정보를 미리 추가를 해두고, 출력을 메소드를 하나 새롭게 만들어서 출력을 하는 법에 대해서 잘 몰라서 찾아보았다.

Map 타입인 menu를 넘겨줘서 menu 에서 전체 키값을 뽑아내는 KeySet() 으로 값을 얻고

for( String item : menu.keySet() ) {
	System.out.println(item + ": " + menu.get(item) );
}

이런식으로 사용도 가능하겠다.

참조 : https://velog.io/@woply/HashMap-%EC%A0%84%EC%B2%B4-%EA%B0%92%EC%9D%84-%EC%B6%9C%EB%A0%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

HashMap - 전체 값을 출력하는 4가지 방법

HashMap을 사용하며 Map에 저장된 전체 값을 출력하는 다양한 방법을 정리하였다.

velog.io

 

 

Lv3) 단어 맞추기 게임

import java.util.Scanner;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        String[] word = {"BAKERY", "PICTURE", "EYES", "TRUE", "FALSE"};
        Scanner sc = new Scanner(System.in);
        int count = 9;
        int answerNum = 0;

        int randomWord = (int) (Math.random() * word.length);

        String[] result = word[randomWord].split("");
        String[] answer = Stream.generate(() -> "_").limit(result.length).toArray(String[]::new);
        do {
            System.out.println("현재 남은 기회 : " + count--);
            System.out.println("A-Z 중 하나를 입력해주세요 : ");
            String temp = sc.nextLine();
            if( temp.length() != 1 || !(65 <= temp.charAt(0) && temp.charAt(0) <= 90) ) {
                System.out.println("정답에 포함된 알파벳이 아닙니다. 기회가 1 차감됩니다.");
                continue;
            }

            for( int i = 0; i < result.length; i++ ) {
                if( result[i].equals(temp) ) {
                    answerNum++;
                    answer[i] = temp;
                }
            }

            StringBuilder sb = new StringBuilder();
            sb.append('[');
            for( String a : answer ) {
                sb.append("'").append(a).append("',");
            }
            sb.deleteCharAt( sb.length()-1 );
            sb.append(']');
            System.out.println(sb.toString());

        } while( answerNum != result.length && count > 0);
        if( count == 0 ) {
            System.out.println("남은 기회가 없습니다.");
            System.out.println("정답은 " + word[randomWord] + "입니다.");
        } else if( answerNum == result.length ) {
            System.out.println("정답입니다.");
        }
    }
}

 

단어 부분만 사전API 에서 가져올 수 있다면 프로그램을 하나 만들었다고 생각이 든다.

Stream API가 성능이 안좋다고 하지만, 간단한 초기화에서는 편하다고 생각한다.

 

원래 코드에서는 System.out.println() 을 많이 사용했으나, 저 부분은 한번에 출력을 해도 상관이 없어서
String을 저장했다가 한번에 출력을 하는 편이 좋다고 생각을 하였다.

StringBuffer을 사용하면 저장을 했다가 한번에 출력이 가능하였다.

 

참조 : https://adjh54.tistory.com/129

 

[Java] String, StringBuffer, StringBuilder 이해하기

해당 페이지에서는 String과 StringBuffer, StringBuilder에 대해서 이해하고 각각의 차이점과 언제 사용해야 하는지에 대해 이해하기 위한 글입니다. 1) String, StringBuffer, StringBuilder 💡 String이란? - Java에

adjh54.tistory.com

 

보너스) 가위 바위 보

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        String[] gifts = {"꽝", "곰돌이 인형", "스파르타 랜드 입장권", "스파르타 캐니언 항공 투어권", "호텔 스파르타 숙박권", "스파르테이트 항공권"};

        Map<Integer, String> map1 = new HashMap<>();
        map1.put(0, "가위");
        map1.put(1, "바위");
        map1.put(2, "보");

        Map<String, String> map2 = new HashMap<>();
        map2.put("가위", "021");
        map2.put("바위", "102");
        map2.put("보", "210");

        Scanner sc = new Scanner(System.in);
        int win = 0;

        for( int i = 0 ; i < 5; i++) {
            String user = "";
            while( true ) {
                System.out.print("가위, 바위, 보 중 하나를 입력해주세요 : ");
                user = sc.nextLine();
                if (user.equals("가위") || user.equals("바위") || user.equals("보")) {
                    break;
                } else {
                    System.out.println("잘못된 입력입니다!");
                }
            }

            String status = map2.get(user);
            int randomNum = (int) (Math.random() * 3);
            String computer = map1.get(randomNum);
            char a = status.charAt(randomNum);
            System.out.println("컴퓨터는 " + computer + "를 냈습니다.");
            switch(a) {
                case '0':
                    System.out.println("비겼습니다.");
                    break;
                case '1':
                    System.out.println(++win + "번 이기셨습니다.");
                    break;
                case '2':
                    System.out.println("졌습니다.");
                    break;
            }
        }
        System.out.println(win + "번 이기셨습니다. " + "경품으로 " + gifts[win] + "을(를) 드리겠습니다.");
    }
}

 

풀이 과정

if 문을 많이 사용하기 싫어서 생각을 해보았다.

간단하게 생각을 해보면
유저가 무엇을 내든 선택지는 3개 밖에 안주어진다. [ 비긴다. 이긴다, 진다 ]
그렇다면 각각의 상태를 숫자로 생각을 해보자.
비긴다 = 0
이긴다 = 1
진다    = 2

그러면 각 가위 바위 보 마다 상태값이 생기게된다.
        map2.put("가위", "021");
        map2.put("바위", "102");
        map2.put("보", "210");

그것이 map2 에 해당한다.
각각 옆에 숫자 0번은 가위에 해당하는 값, 1번은 바위에 해당 하는 값, 2번은 보에 해당하는 값이 된다.


그렇기 때문에 컴퓨터의 0~2번의 랜덤 숫자에 의해 상태값만 뽑아오면 값이 나오게 된다.

마지막에
상품관련 정보가 적혀있지 않아서 정답을에서 찾아서 적었다.