반례 드립니다. T는 한 칸 위로 가는 연산이라 숫자만 변경되는게 맞는 것 같은데 알파벳도 변하네요.
1063번 - 킹
반례 드립니다. T는 한 칸 위로 가는 연산이라 숫자만 변경되는게 맞는 것 같은데 알파벳도 변하네요.
추가로 반례를 다 확인해 보신건진 모르겠으나 아래 링크의 입력 또한 제대로 답이 출력되진 않습니다.
죄송한데요 한번만 다시 봐주실수 있으세요,,,? 이번거는 링크 주신 것도 다 되는데 틀렸다고 뜨네요ㅠㅠ
코드 남겨주시면 한번 자세히 살펴볼게요! 이전엔 반례만 일단 돌려본거라..
늦어도 내일까진 답변 드리겠습니다
@exponential_e 감사합니다!
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Main {
static Map<String,Integer[]> map = new HashMap<String,Intger[]>() {{
put("R",Arrays.asList(0,1));
put("L",Arrays.asList(0,-1));
put("B",Arrays.asList(-1,0));
put("T",Arrays.asList(1,0));
put("RT",Arrays.asList(1,1));
put("LT",Arrays.asList(1,-1));
put("RB",Arrays.asList(-1,1));
put("LB",Arrays.asList(-1,-1));
}};
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
// (x,y) - x는 1~8, y는 0~7
//킹의 위치
String a = sc.next();
int[] king = {a.charAt(1)-'0', a.charAt(0)-'A'};
//돌의 위치
String b = sc.next();
int[] stone = {b.charAt(1)-'0', b.charAt(0)-'A'};
int n = sc.nextInt();
for(int i=0;i<n;i++){
String move = sc.next();
if(king[0]+map.get(move).get(0) <= 0 || king[0]+map.get(move).get(0) >= 9 ||
king[1]+map.get(move).get(1) < 0 || king[1]+map.get(move).get(1) >= 8) {
continue;
}
else if(stone[0]+map.get(move).get(0) <= 0 || stone[0]+map.get(move).get(0) >= 9 ||
stone[1]+map.get(move).get(1) < 0 || stone[1]+map.get(move).get(1) >= 8) {
continue;
}else {
if(king[0]+map.get(move).get(0) == stone[0] && king[1]+map.get(move).get(1) == stone[1]) {
stone[0] = stone[0] + map.get(move).get(0);
stone[1] = stone[1] + map.get(move).get(1);
}
king[0] = (int)king[0] + (int)map.get(move).get(0);
king[1] = (int)king[1] + (int)map.get(move).get(1);
}
}
System.out.println((char)(king[1]+'A')+""+(char)(king[0]+'0'));
System.out.println((char)(stone[1]+'A')+""+(char)(stone[0]+'0'));
}
}
우선 아래 코드로 제가 테스트해봤는데, HashMap에 Arrays.aList가 제 IDE에서 동작하지가 않아서.. 그냥 클래스로 바꾼 것 말곤 다른 건 없습니다.
(aList 기능은 잘 모르겠지만 행과 열을 분리해 계산하기 위해 의도하신게 맞다면, 같은 기능으로 보셔도 무방할 것 같습니다.)
(또한 aList의 get[0] -> x, get[1] -> y로 수정되어있습니다.)
여기서 43번째 줄의 조건문은 킹의 움직임이고 48번째 조건문은 돌의 움직임인데 둘 중 하나라도 밖으로 나가면 continue를 하게 되어있습니다.
아마도 '입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동' 이 부분을 고려해 짜신 것 같은데 놓치신 부분이 그 옆의 조건입니다.
'입력으로 킹이 어떻게 움직여야 하는지 주어진다' -> 즉 현재 들어오는 움직임에 대한 입력은 '킹'만을 위한 움직임 입니다.
돌은 문제 조건에 따라 킹의과 위치가 겹칠 가능성이 있을 때 -> 문제의 설명에 따르면 '돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동' 이 부분 입니다.
이러한 가능성이 있을 때만 움직임에 영향을 받죠.
따라서 아래의 입력이 주어졌을 때
C1 A1 1
L
답은 B1, A1이 맞으나
작성자님 코드에선 C1, A1으로 답이 출력됩니다.
푼지 조금 오래된 문제라.. 아마 기억대로면 위에 말씀드린 부분만 고친다면 정답 출력할 것 같습니다.
댓글을 작성하려면 로그인해야 합니다.
rlaskdus4713 3년 전
이 문제 질문 남기신 분들 글 반례들도 다 해봤는데 잘 나왔어요,,, 뭐가 문젠지 잘 모르겠습니다 ㅠㅠ