swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
[ 풀이 코드 ]
삼성의 시뮬문제.. 예시 하나만 제대로 맞으면 다 맞았다고 보면 되는 문제이다.
디테일한 방향설정이 중요하다 . 보통 틀리다고 하는 경우는 방향이 쪼오끔 틀린 경우 가 아닐까
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 핀볼게임 {
static int [][]HoleX = new int[11][2];
static int [][]HoleY = new int[11][2];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine().trim());
StringBuilder sb = new StringBuilder();
for(int tc = 1; tc<=T; tc++) {
int N = Integer.parseInt(br.readLine().trim());
int [][]arr = new int[N+2][N+2];
HoleX[6][0]=-1;
HoleX[7][0]=-1;
HoleX[8][0]=-1;
HoleX[9][0]=-1;
HoleX[10][0]=-1;
for(int i =1; i<= N;i++) {
StringTokenizer st =new StringTokenizer(br.readLine());
for(int j =1; j<= N; j++) {
int x = Integer.parseInt(st.nextToken());
if(x>5) {
if(HoleX[x][0]==-1) {
HoleX[x][0]= i;
HoleY[x][0]=j;
}else {
HoleX[x][1]=i;
HoleY[x][1]=j;
}
}
arr[i][j]=x;
}
}
for(int i =0; i< N+2 ;i++) {
arr[0][i] = 5;
arr[N+1][i] =5;
arr[i][0] = 5;
arr[i][N+1] = 5;
}
int []dj = {0,0,1,-1};
int []di = {-1,1,0,0};
// 0:상하좌우 1: 하,좌,우,상 2:좌,상,우,하 3:우,상,하,좌 4:하,우,상,좌 5:하,상,우,좌
int [][]dir = new int[][] {{0,1,2,3},{1,2,3,0},{2,0,3,1},{3,0,1,2},{1,3,0,2},{1,0,3,2}};
int ans = 0;
int[][][] point = new int[N][N][4]; // 요기까지의 점수를 넣자
for(int I =1 ;I<= N; I++) {
for(int J =1; J<= N; J++) {
if(arr[I][J]!=0)continue;
for(int D = 0 ; D<4; D++) {
//System.out.println(I+","+J+","+D+"로 시작");
int p = 0;
int i = I;
int j = J;
int d = D;
//boolean[][] v = new boolean[N+2][N+2];
//v[i][j]= true;
i+=di[d];j+=dj[d];
while(!(i==I && j==J) && arr[i][j]!=-1) {
int b = arr[i][j]; // 현재 블록 적힌거
if(b>5) {
if(i!=HoleX[b][0])i=HoleX[b][0];
else i=HoleX[b][1];
if(j!=HoleY[b][0])j = HoleY[b][0];
else j = HoleY[b][1];
i+=di[d];j+=dj[d];
//System.out.println("현재위치 블랙홀:"+i+","+j+"포인트 :"+p);
}else {
if(b!=0)p++;//블록이라면 더해주고
if(b!=0) {
//System.out.println("현재위치:"+i+","+j+"포인트 :"+p);
}
d = dir[b][d]; // 바뀔 방향
i+=di[d]; j+=dj[d]; // 방향에 따르기
}
}
ans = p>ans?p:ans;
//System.out.println("앤써 "+p);
}
}
}
sb.append('#').append(tc).append(" ").append(ans).append('\n');
}
System.out.println(sb);// |\ |/ \| /| | |
}
}
제일 중요한 부분은 여기가 아닐까..
'코딩테스트 연습 > SW Expert Academy' 카테고리의 다른 글
[SWEA / 5644번 ] [모의 SW 역량테스트] 무선 충전 (0) | 2020.10.13 |
---|---|
[ SWEA / 2477번 ] [모의 SW 역량테스트] 차량 정비소 - solved by Java (0) | 2020.10.13 |
[ SWEA ] 5648. [모의 SW 역량테스트] 원자 소멸 시뮬레이션 - by java (0) | 2020.10.12 |
[ SWEA ] 2383. [모의 SW 역량테스트] 점심 식사시간 - JAVA (0) | 2020.10.08 |
[ SWEA ] 2105. [모의 SW 역량테스트] 디저트 카페 - JAVA (0) | 2020.10.07 |