https://www.acmicpc.net/problem/2503
이문제를 풀려면 각 자릿수의 값을 비교해가면서 풀어야 하는데
1. 나눗셈으로 각 자릿수 숫자 찾아서 비교하기
2. 문자열로 바꿔서 비교하기
이렇게 두개로 나뉘는거 같다 나는 첫번째 방법으로 했는데 다풀고 나니 뭔가 2번이 더 간단했을 것 같은 느낌이 조금 든다.
각 자리에 1~9의 숫자가 곂치지 않게 나오기 때문에 123~987의 영역을 탐색해야 한다.
그리고 123~987영역에는 0이 들어간 값과, 222 처럼 숫자가 곂치는 값이 존재하기 때문에 그 값들을 제외하고 탐색해야 한다.
위에서 말한 탐색 영역에서 N개의 조건을 만족하는 개수를 찾으면 된다.
import java.util.ArrayList;
import java.util.Scanner;
import java.lang.Math;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int [][] arr = new int[N][3];
int result = 0;
for(int i=0; i<N; i++){
arr[i][0] = sc.nextInt();
arr[i][1] = sc.nextInt();
arr[i][2] = sc.nextInt();
}
for(int i = 123; i <= 987; i++){
int num = i;
int countAnswer = 0;
ArrayList<Integer> digit = new ArrayList<>();
while(num > 0){ //각 자릿수 값 구하기
digit.add(num % 10);
num /= 10;
}
if(digit.get(0)==digit.get(1) //중복이나 0들어간 값 삭제
||digit.get(0)==digit.get(2)
||digit.get(1)==digit.get(2)
||digit.contains(0)){
continue;
}
for (int j = 0; j < N; j++){ //스트라이크 개수 세기
int countStrike = 0;
int countBall = 0;
for(int k = 0; k < 3; k++){
if (Math.floor(arr[j][0]%Math.pow(10,k+1)/Math.pow(10,k))==digit.get(2-k)){
countStrike++;
}
}
for(int k = 0; k < 3; k++){ //볼 개수 세기
for (int l = 0; l < 3; l++){
if(Math.floor(arr[j][0]%Math.pow(10,k+1)/Math.pow(10,k))==digit.get(l))
countBall++;
}
}
countBall -= countStrike; //같은 숫자가 존재한다면 볼로 카운트 했기 때문에 countBall에 스트라이크가 까지 들어있다. 따라서 스트라이크 개수는 제외해줘야 함
if(countStrike == arr[j][1] && countBall == arr[j][2])
countAnswer++;
}
if (countAnswer == N) result++; //질문을 모두 만족해야지 정답이 될 수 있다.
}
System.out.println(result);
}
}
Math.floor(숫자)
소숫점 제거
Math.pow(a, b)
Math.pow(a, b)는 a^b
문제 풀면서 for문에 자꾸 값 잘못 넣어서 오류가 났다.
역시 자릿수 구하는 문제들은 좀 헷갈린다 ㅠㅠ
각 자릿수 구하는 부분은 메소드로 만들었으면 더 좋았을 것 같지만 오늘은 할일이 많으니까 여기까지~
'코딩테스트' 카테고리의 다른 글
[완전탐색] 프로그래머스 모의고사 (0) | 2022.11.06 |
---|---|
[완전탐색] 백준 14889번 스타트와 링크 (0) | 2022.10.13 |
[완전탐색] 백준 2231번 분해합 (0) | 2022.10.06 |
[그리디] 프로그래머스 체육복 (0) | 2022.10.04 |
[그리디] 백준 11000번 강의실 배정 (0) | 2022.09.26 |
댓글