본문 바로가기

개발공부/프로그래머스 뽀개기

[프로그래머스][자바] 숫자야구

 

문제 설명

숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다.

 

각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.

 

* 숫자는 맞지만, 위치가 틀렸을 때는 볼

* 숫자와 위치가 모두 맞을 때는 스트라이크

* 숫자와 위치가 모두 틀렸을 때는 아웃

 

예를 들어, 아래의 경우가 있으면

A : 123 B : 1스트라이크 1볼. A : 356 B : 1스트라이크 0볼. A : 327 B : 2스트라이크 0볼. A : 489 B : 0스트라이크 1볼.

이때 가능한 답은 324와 328 두 가지입니다.

질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • 질문의 수는 1 이상 100 이하의 자연수입니다.
  • baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

입출력 예

baseball                                                                   return

[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2

풀이법

🙄 123~987 까지 수를 다 돌려서 조건에 맞는지 비교해서 답 구하면된다

1. 3중 for문으로 나올수 있는 숫자 배열 만들어준다(같은 수 나오는 건 빼줌)

2. 숫자 배열을 stack에 집어 넣어준다.

3. 스택을 하나하나 확인한다 (strike 함수, ball 함수 리턴값이 알려준 strike, ball 값이랑 같으면 +1)

- 그 숫자가 주어진 전체 조건과 맞아야함. 그래서 if(chk == baseball.length) 체크함.

4. strike함수 : for문으로 같은자리, 같은 수인지 확인

5. ball 함수 : for문으로 다른자리, 같은 수인지 확인

 

하....뭐 다른 방법이 있겠지 하고 엄청나게 헤맸다가 결국 다른 사람들 답 찾아보니 없는듯 걍 다 비교라고 보면된다..^^

완전탐색카테고리에 있는 이유가 있겠지 과거의 나야...^^

 


import java.util.Stack;

public class wantam3 {

	public static void main(String[] args) {
		int[][] baseball = {{123, 1, 1}, {356, 1, 0}, {327, 2, 0}, {489, 0, 1}}; 
		
		System.out.println(solution(baseball)); //2
		
//		baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
	}

    public static int solution(int[][] baseball) {
        int answer = 0;
    	Stack<String> all = new Stack<String>();
    	
        for(int i=1; i<10;i++) {
        	for(int j=1; j<10;j++) {
        		for(int k=1;k<10;k++) {
        			if(i != k && i != j && k != j) {
        			all.push(Integer.toString(i)+Integer.toString(j)+Integer.toString(k));
        		
        			}
        		}
        	}
        }
        
       

        while(all.size()>0) {
        	int chk = 0;
        	for(int i=0; i<baseball.length;i++) {
        			if(strike(all.peek(),Integer.toString(baseball[i][0]))== baseball[i][1]
        					&&ball(all.peek(),Integer.toString(baseball[i][0])) == baseball[i][2] ) {
        				chk += 1;
        			}
        			
        	}
        	if(chk == baseball.length) {
        		answer +=1;        		
        	}
        	all.pop();
        }
        
        return answer;
    }
    public static int strike(String stk, String ori) {
    	int ans =0;
    	String[] stk2= stk.split("");
    	String[] ori2 = ori.split("");
    	
    	for(int i=0;i<stk2.length;i++) {
    		if(stk2[i].equals(ori2[i])) {
    			ans += 1;
    		}
    	}
		return ans;
		}
    
    public static int ball(String stk, String ori) {
    	int ans =0;
    	
    	String[] stk2= stk.split("");
    	String[] ori2 = ori.split("");
    	
    	for(int i=0;i<stk2.length;i++) {
    		for(int j=0; j<stk2.length;j++) {
    			if(i != j && stk2[i].equals(ori2[j])) {
    				ans += 1;
    			}
    		}
    	}
    	
		return ans;
		}
    
}

https://programmers.co.kr/learn/courses/30/lessons/42841

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr