윷놀이는 4개의 윷을 이용하는 게임이다.
도 : 1개가 뒤집어진 상태
개 : 2개가 뒤집어진 상태
걸 : 3개가 뒤집어진 상태
윷 : 4개가 뒤집어진 상태
모 : 하나도 뒤집어지지 않은 상태
4개의 윷 상태가 입력되면 도, 개, 걸, 윷, 모를 출력하는 프로그램을 작성하시오.
입력
① 윷의 4가지 상태가 공백으로 구분되어 입력된다.
② 윷의 상태가 0이면 뒤집어 지지 않은 상태, 1이면 뒤집어진 상태를 의미한다.
출력
윷의 상태를 보고 도, 개, 걸, 윷, 모를 판단하여 출력한다.
여기서 추가되는 형태로
10 회를 굴려서 각각 윷이 나온 상태를 표시하기
ex ) 도 x회 개 x회...
그래서 임의로 지정한 x는 총 몇칸을 전진했는지까지
나의 풀이
/*
0 : 안뒤집힘, 1: 뒤집어진 상태
* 모 : 모두 0
* 도 : 1개 1
* 개 : 2개 1
* 걸 : 3개 1
* 윷 : 4개 1
* */
/*
* 1. 도개걸윳모 판단해서 출력
* 2. 10회를 굴려서 각각 윷이 나온 상태 표시
* ex)도 x회,개x회
* 3. 총 몇칸 전진했는지 표시
* 도는 1칸 전진, 개는 2칸 전진, 걸은 3칸 전진, 윷은 4칸 전진, 모는 5칸을 전진합니다.
* */
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Yutnori {
public static void main(String[] args) {
int sum = 0;
Map<Integer,Integer> map = new HashMap<>();
for(int i=0; i<10; i++){
String input = generateYut();
int result = game(input);
map.merge(result, 1, Integer::sum);
sum += result;
}
String[] resultYutStr = {"모","도","개","걸","윷"};
for(int i=0; i< resultYutStr.length; i++){
printYut(resultYutStr,map,i);
}
System.out.println();
System.out.println("총"+sum+"칸 전진하였습니다.");
}
// 윷 게임 결과 출력
private static void printYut(String[] resultYutStr, Map<Integer, Integer> map, int i) {
if(map.containsKey(i)){
System.out.print(resultYutStr[i]+" "+map.get(i)+"회 ");
}
}
// 뒤집힌 윷 카운트
private static int game(String input) {
String[] arr = input.split(" ");
int result = 0;
for(String s : arr){
result += Integer.parseInt(s);
}
return result;
}
// 입력값 생성
// 0 : 안뒤집힘, 1: 뒤집어진 상태
public static String generateYut(){
Random random = new Random();
StringBuilder sb = new StringBuilder();
sb.append(random.nextInt(2));
for(int i=0;i<3;i++){
sb.append(" ");
sb.append(random.nextInt(2));
}
return sb.toString();
}
}
Map 컬렉션을 이용해서 result를 key로 지정해서 count를 해주었는데,
null값인 경우 1로 초기화를 해주려고 하니 인텔리제이에서 merge메소드를 추천해주었다.
이에 대해 학습해보았다.
Map 컬렉션 merge 메소드
*java Doc 내용
If the specified key is not already associated with a value or is associated with null, associates it with the given non-null value. Otherwise, replaces the associated value with the results of the given remapping function, or removes if the result is null. This method may be of use when combining multiple mapped values for a key. For example, to either create or append a String msg to a value mapping:
map.merge(key, msg, String::concat)
지정된 키가 아직 값과 연결되어 있지 않거나 null과 연결된 경우 해당 키를 지정된 null이 아닌 값과 연결합니다.
그렇지 않으면 연관된 값을 지정된 재매핑 함수의 결과로 대체하거나 결과가 널인 경우 제거합니다.
이 방법은 키에 대해 매핑된 여러 값을 결합할 때 유용할 수 있습니다.
예를 들어 문자열 메시지를 생성하거나 값 매핑에 추가하려면 다음을 수행합니다.
map.merge(key, msg, String::concat)
Map에서 key가 연관된 값이 없거나 null인경우 msg를 value값으로 넣는다.
value값이 있는 경우 값을 remapping function의 결과 값으로 대체하거나 그 결과 값도 null인 경우 제거한다.
key에 대한 다수의 value를 결합할 때 사용하기 좋을 것 같다.
나는 map.merge(key,1,Integer::sum) 으로 사용했는데,
key라는 key값이 value값이 null인 경우 1를 담아준다.
아닌 경우 value값의 합을 value로 다시 담아준다.
굳이 map을 쓸 필요 있나?
배열로 다시 풀었다.
import java.util.*;
public class Yutnori {
public static void main(String[] args) {
int sum = 0;
int[] arr = new int[5]; // 결과값을 담을 배열
for(int i=0; i<10; i++){
String input = generateYut(); // 입력값 생성
int result = game(input); // 윳 개수 카운팅
arr[result]++;
sum += result;
}
String[] resultYutStr = {"모","도","개","걸","윷"};
for(int i=0; i< resultYutStr.length; i++){
printYut(resultYutStr,arr,i);
}
System.out.println();
System.out.println("총"+sum+"칸 전진하였습니다.");
}
// 윷 게임 결과 출력
private static void printYut(String[] resultYutStr, int[] arr, int i) {
if(arr[i]>0){
System.out.print(resultYutStr[i]+" "+arr[i]+"회 ");
}
}
// 뒤집힌 윷 카운트
private static int game(String input) {
String[] arr = input.split(" ");
int result = 0;
for(String s : arr){
result += Integer.parseInt(s);
}
return result;
}
// 입력값 생성
// 0 : 안뒤집힘, 1: 뒤집어진 상태
public static String generateYut(){
Random random = new Random();
StringBuilder sb = new StringBuilder();
sb.append(random.nextInt(2));
for(int i=0;i<3;i++){
sb.append(" ");
sb.append(random.nextInt(2));
}
return sb.toString();
}
}
'CS > 알고리즘' 카테고리의 다른 글
java 8퀸 문제 (0) | 2023.12.29 |
---|---|
재귀로 푸는 괄호 추가하기 문제 (0) | 2023.11.16 |
게임개발 구현 문제풀이(좌표값 이동) (0) | 2023.11.05 |
하노이의 탑 (0) | 2023.10.27 |
시간 계산하기(손코딩) (0) | 2023.10.20 |