티스토리 뷰
문제 : https://www.acmicpc.net/problem/1514
1. 시간초과는 아니지만 틀렸다고....
2. 좀더 확인이 필요. 방법이 잘못되었는지.
소스코드
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Baekjoon1514 {
//public class Main {
public static void main(String[] args)
throws FileNotFoundException
{
File file =new File("D:\\dev\\worksspace\\Solution\\src\\Baekjoon1514");
Scanner sc = new Scanner(file);
// Scanner sc = new Scanner(System.in);
// long start = System.currentTimeMillis();
while (sc.hasNext()) {
int numCnt = sc.nextInt();
String curSt = sc.next();
String goalSt = sc.next();
int[] curArr = new int[numCnt+2];
int[] goalArr = new int[numCnt+2];
for (int i = 0; i < numCnt; i++) {
curArr[i] = Integer.parseInt(curSt.substring(i,i+1));
goalArr[i] = Integer.parseInt(goalSt.substring(i,i+1));
}
int answer = 0; // 움직인 cnt
int[][][] jArr = new int[20][20][20]; // 목표값과 일정 차이일때, 최적 j
int[][][] kArr = new int[20][20][20]; // 목표값과 일정 차이일때, 최적 k
//알고리즘 시작
for (int i = 0; i < numCnt; i++) {
while (curArr[i] != goalArr[i]) {
int maxK = Math.min(numCnt-i,3);
int targetJ = 99;
int targetK = 0;
if(maxK == 3 && jArr[curArr[i]-goalArr[i]+10][curArr[i+1]-goalArr[i+1]+10][curArr[i+2]-goalArr[i+2]+10] != 0){
targetJ = jArr[curArr[i]-goalArr[i]+10][curArr[i+1]-goalArr[i+1]+10][curArr[i+2]-goalArr[i+2]+10];
targetK = kArr[curArr[i]-goalArr[i]+10][curArr[i+1]-goalArr[i+1]+10][curArr[i+2]-goalArr[i+2]+10];
}else{
//1. 위아래 몇번 움직일지 정하기.
int jDiff = 99;
for (int j = -3; j <= 3; j++) { // 위아래 -3~3
int tempdiff = Math.abs(curArr[i]+j - goalArr[i]);
if(tempdiff <jDiff){
jDiff = tempdiff;
targetJ = j;
}
}
//2. 첫번째 값의 차이가 가장 적을때,
int minDiff = 999;
for (int k = 1; k <= maxK; k++) { // 갯수 : 1개 2개 3개
int tempDiff = 0;
int tempVal = 0;
for (int j = 0; j < 3; j++) {
if(j < k){
tempVal = (curArr[i+j]+targetJ+10)%10 - goalArr[i+j];
}else{
tempVal = curArr[i+j] - goalArr[i+j];
}
tempVal = Math.abs(tempVal);
tempVal = tempVal > 5 ? 10-tempVal : tempVal;
tempDiff += tempVal;
}
if(tempDiff <= minDiff){
//여기서 애매함. <로 쓸지 <=일지 다른기준이필요한지
targetK = k;
minDiff = tempDiff;
}
}
//3. dp 값 insert
if(maxK == 3){
jArr[curArr[i]-goalArr[i]+10][curArr[i+1]-goalArr[i+1]+10][curArr[i+2]-goalArr[i+2]+10] = targetJ;
kArr[curArr[i]-goalArr[i]+10][curArr[i+1]-goalArr[i+1]+10][curArr[i+2]-goalArr[i+2]+10] = targetK;
}
}
//4. curArr Update;
for (int j = 0; j < targetK; j++) {
curArr[i+j] = (curArr[i+j]+targetJ+10)%10;
}
answer++;
//5.로그.....
for (int j = 0; j < numCnt; j++) {
System.out.print(curArr[j]);
}
System.out.println();
System.out.println("j:" + targetJ+", k:"+targetK);
System.out.println();
}
}
System.out.println(answer);
}
// long end = System.currentTimeMillis();
// System.out.println("time "+ (end-start)/1000.0);
}
}
/*
3
555
464
2
4
1234
3456
2
*/
'Programming > Algorithm' 카테고리의 다른 글
[중상] 집합 (1043) | 2016.10.31 |
---|---|
[DP] 백준 알고리즘 1126번 같은 탑 (1322) | 2016.10.27 |
[DP] 백준 알고리즘 4781번 사탕가게 (1073) | 2016.10.25 |
[DP] 백준 알고리즘 2011번 암호코드 (984) | 2016.10.24 |
[DP] 백준 알고리즘 1017번 소수 쌍 (972) | 2016.09.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 존맛탱
- 혁오
- 웰빙헬스
- 프리티어
- 알고리즘
- 중국어강의
- 부동산거래계약신고필증
- 부동신 계약시 주의사항
- GraphQL
- s9+
- 크러쉬
- AWS nodejs
- Axis2
- 중국어공부
- 서머너즈워
- 수미네 반찬
- 생활코딩
- 중국어정리
- 로꼬
- Git
- Bitnami
- 프렌즈
- 마시내 탕수육
- 뒤꿈치 건조함
- 10cm
- 고운발크림
- 자금조달계획서
- 노브랜드
- AWS npm
- ES6
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함