rlaskdus4713   3년 전

이 문제 질문 남기신 분들 글 반례들도 다 해봤는데 잘 나왔어요,,, 뭐가 문젠지 잘 모르겠습니다 ㅠㅠ

exponential_e   3년 전

반례 드립니다. T는 한 칸 위로 가는 연산이라 숫자만 변경되는게 맞는 것 같은데 알파벳도 변하네요.

exponential_e   3년 전

추가로 반례를 다 확인해 보신건진 모르겠으나 아래 링크의 입력 또한 제대로 답이 출력되진 않습니다.

https://www.acmicpc.net/board/view/39287

exponential_e   3년 전

이것도 추가 드립니다.

https://www.acmicpc.net/board/view/53032

rlaskdus4713   3년 전

@exponential_e

덕분에 그 부분 수정했습니다 계속 수정하다가 그전 코드에서 되서 된줄 알았나봐요ㅠㅠ

저건 해결했는데 아직도 실패가 뜨네요 반례 더 찾아보겠습니다...!

rlaskdus4713   3년 전

@exponential_e

죄송한데요 한번만 다시 봐주실수 있으세요,,,? 이번거는 링크 주신 것도 다 되는데 틀렸다고 뜨네요ㅠㅠ

exponential_e   3년 전

코드 남겨주시면 한번 자세히 살펴볼게요! 이전엔 반례만 일단 돌려본거라..

늦어도 내일까진 답변 드리겠습니다

rlaskdus4713   3년 전

@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'));

}

}

exponential_e   3년 전

우선 아래 코드로 제가 테스트해봤는데, 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년 전


@exponential_e 

시간내서 이렇게 도와주셔서 너무 감사해요!

제 코드가 수정할 부분이 많네요!

풀이 참고해서 다시 풀어볼게요 너무 감사합니다!!

댓글을 작성하려면 로그인해야 합니다.