상세 컨텐츠

본문 제목

[JAVA] 자바 예제 - 12지신 최단 거리 구하기(Pathfinding)

공-부/Homework

by 사랑짱 2021. 6. 9. 20:16

본문

<문제>

배열안에, 12지신을 의미하는 문자들이 들어 있을 때 최단거리를 찾는 프로그램을 작성하시오.


12지신 배열 : "자/축/인/묘/진/사/오/미/신/유/술/해"

(12개의 문자를 찾아가는 경로는 '순방향'과 '역방향'이 모두 가능하다!)

 


문제 해결 포인트

두 문자의 최단거리를 찾아야 하는데, 그 경로는 순방향일 수도, 역방향일 수도 있다.

배열에는 총 12개의 요소가 있으므로 두 문자의 순방향 거리와 역방향 거리를 중

6이하('2/전체거리')인 거리가 최단 거리가 된다.

 

이러한 전제조건을 활용하여 문제를 풀어보자.

 


문제 해결 과정

 

Step 1. char 타입의 배열에 값목록으로 12지신 요소를 입력하여 배열을 생성한다.


Step 2. Scanner를 통해 두개의 문자(시작지점, 도착지점)를 입력받는다.

   2-1. Scanner는 char타입의 문자를 받을 수 없으므로 charAt( )메소드를 이용한다.

 

Step 3. for문을 통해 입력받은 지점의 인덱스를 구한다.

   3-1. 조건문을 통해 시작인덱스, 도착인덱스에 값을 대입한다.

   3-2. 이때, 두 개의 지점이 같은 곳일 수도 있으므로 if문-if문을 사용한다.

 

Step 4. 두개의 문자 사이의 최단 거리를 구한다.

   4-1. 인덱스1과 인덱스2의 크기를 비교한다.

          4-2. 인덱스1 < 인덱스2인 경우 : distance = index2 - index1 (순방향->)

          - 순방향 거리가 전체거리/2보다 작으면 최단거리, 크면 역방향거리가 최단거리

          4-3. 인덱스1 > 인덱스2인 경우 : distance = index1 - index2(역방향<-)

          - 역방향 거리가 전체거리/2보다 작으면 최단거리, 크면 순방향거리가 최단거리

          4-4. 인덱스1 = 인덱스2인 경우 : distance =0

 

Step 5. Step4 내용을 기반으로 최단거리를 출력한다.

 

 

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import java.util.Scanner;
import lombok.extern.log4j.Log4j;
 
 
@Log4j
public class Pathfinding {
 
    
    public static void main(String[] args) {            
        Scanner sc = new Scanner(System.in);
 
        //값 목록으로 배열 생성
        char[] gods = {'자''축''인''묘''진''사''오''미''신''유''술''해'};    
 
        char god1 = sc.next().charAt(0);    //시작지점
        char god2 = sc.next().charAt(0);    //도착지점
 
        sc.close();
        
        int distance;                        //시작-도착지점 거리    
        int index1 = 0;                        //시작인덱스
        int index2 = 0;                        //도착인덱스
        
        for(int i = 0; i < gods.length; i++) {
            if(gods[i] == god1) {            //시작지점 인덱스
                index1 = i;
            } 
            if(gods[i] == god2) {             //도착지점 인덱스
                index2 = i;
            } //if-else
                
        } //for
        
        
        //전제조건 : 거리가 전체거리/2보다 작으면 최단거리가 된다.
        if(index1 < index2) {                        
            distance = index2 - index1;                //거리 - 순방향
            
            if(distance < gods.length/2) {
                log.info("순방향입니다.");
                log.info("최단거리는 : " + distance);    
 
            } else if(distance > gods.length/2){
                distance = gods.length - distance;
 
                log.info("역방향입니다.");
                log.info("최단거리는 : " + distance);
 
            } else {
                log.info("순방향과 역방향이 같습니다.");
                log.info("최단거리는 : " + distance);
 
            } //if-else
            
        } else if(index1 > index2) {
            distance = index1 - index2;                //거리 - 역방향
            
            if(distance < gods.length/2) {
                log.info("역방향입니다.");
                log.info("최단거리는 : " + distance);
 
            } else if(distance > gods.length/2){
                distance = gods.length - distance;
 
                log.info("순방향입니다.");
                log.info("최단거리는 : " + distance);
 
            } else {
                log.info("순방향과 역방향이 같습니다.");
                log.info("최단거리는 : " + distance);
 
            } //if-else
            
        } else {
            log.info("제자리입니다.");
            
        } // if-else
        
    }    //main
 
}    //end class
cs

관련글 더보기