삐까냥의 파도타기
14890번) 경사로 본문
문제 출처 : https://www.acmicpc.net/problem/14890
2018년 4월 6일 - 시험용 코드(45분) import java.util.HashSet; import java.util.Scanner; public class Q14890 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int mapSize = sc.nextInt(); int[][] map = new int[mapSize][mapSize];
int helperSize = sc.nextInt(); for (int i = 0; i < mapSize; i++) { for (int j = 0; j < mapSize; j++) { map[i][j] = sc.nextInt(); } }
int result = 0;
for (int i = 0; i < mapSize; i++) { int tempResult = getResult(map[i], helperSize); // System.out.println("#" + (i+1) + " / " + tempResult);
result += tempResult; }
for (int i = 0; i < mapSize; i++) { int[] route = new int[mapSize]; for (int j = 0; j < mapSize; j++) { route[j] = map[j][i]; } int tempResult = getResult(route, helperSize); // System.out.println("#" + (i+1) + " / " + tempResult);
result += tempResult; } System.out.println(result); }
static int getResult(int[] route, int helperSize) { HashSet<Integer> helperPosition = new HashSet<Integer>(); int mapSize = route.length;
int beforeLevel = route[0]; for (int i = 1; i < mapSize; i++) {
int nowLevel = route[i]; if (beforeLevel == nowLevel) { continue; } else if (beforeLevel == nowLevel-1) { //올라가면 이전을 살펴봐야한다. if (i-helperSize >= 0) { for (int k = i-1; k >= i-helperSize; k--) { if (beforeLevel != route[k] || helperPosition.contains(k)) { return 0; } helperPosition.add(k); // System.out.println(beforeLevel); } } else { return 0; } } else if (beforeLevel == nowLevel+1) { //내려가면 다음을 봐야한다. if (i+helperSize-1 < mapSize) { helperPosition.add(i); for (int k = i+1; k < i+helperSize; k++) { if (nowLevel != route[k] || helperPosition.contains(k)) { return 0; } helperPosition.add(k); } i += helperSize-1; } else { return 0; } } else { return 0; } beforeLevel = nowLevel; } return 1; } } |
위의 코드에서는 사다리를 사용한 자리를 체크하는 HashSet을 사용했다면,
아래 코드는 배열을 통해, 사다리를 사용한 자리를 체크 했습니다.
확실히 세번 풀어보니, 넘나 쉽게 느껴졌네요.
2018년 4월 12일 - 다듬지 않은 코드 (소요시간 26분) import java.util.Scanner; public class Q14890 { static int size, helperSize; public static void main(String[] args) { Scanner sc = new Scanner(System.in); size = sc.nextInt(); helperSize = sc.nextInt();
int[][] map = new int[size][size]; for (int i = 0 ; i < size; i++) { for (int j = 0 ; j < size; j++) { map[i][j] = sc.nextInt(); } }
int result = 0; for (int i = 0 ; i < size; i++) { result += searchRoute(map[i]); }
for (int i = 0; i < size; i++) { int[] tempMap = new int[size]; for (int j = 0; j < size; j++) { tempMap[j] = map[j][i]; } result += searchRoute(tempMap); }
System.out.println(result);
}
static int searchRoute(int[] map) { boolean[] isUsedHelper = new boolean[size]; for (int i = 0; i < size-1; i++) { int nowBlock = map[i]; int nextBlock = map[i+1]; if (nowBlock == nextBlock) { continue; } else if (nowBlock == nextBlock-1) { //올라 갈때 -> 이전 블록 검사 if (0 <= i+1-helperSize) { //우선 놓을 만큼의 공간이 있다. for (int j = i; j >= i+1-helperSize; j--) { if (isUsedHelper[j] || nowBlock != map[j]) { return 0; } isUsedHelper[j] = true; } } else { return 0; } } else if (nowBlock == nextBlock+1) { //내려 갈때 -> 다음 블록 검사 if (i+helperSize < size) { //우선 놓을 만큼의 공간이 있다. isUsedHelper[i+1] = true; for (int j = i+2; j <= i+helperSize; j++) { if (isUsedHelper[j] || nextBlock != map[j]) { return 0; } isUsedHelper[j] = true; }
//놓을 수 있다. i += helperSize-1; } else { return 0; } } else { return 0; } } return 1; } } |
'코딩 > 삼성 SW 역량 테스트 기출' 카테고리의 다른 글
14891번) 톱니바퀴 (0) | 2018.04.07 |
---|---|
14888번) 연산자 끼워넣기 (0) | 2018.04.06 |
14503번) 로봇 청소기 (0) | 2018.04.06 |
14889번) 스타트와 링크 (0) | 2018.04.06 |
3190번) 뱀 (0) | 2018.04.06 |