반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [SW expert Academy] SWEA 8382번 방향 전환 자바(Java)

1) 난이도 : D4

 

2) 문제번호 : 8382번

 

3) 문제 출처

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWyNQrCahHcDFAVP&categoryId=AWyNQrCahHcDFAVP&categoryType=CODE&problemTitle=%EB%B0%A9%ED%96%A5&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

2. 문제

(x1, y1 )에서 (x2, y2)로 이동하려고 한다.

(x, y)에서 한 번 이동하면 (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)로 이동할 수 있다.

이 중에서, (x + 1, y), (x - 1, y)로 이동하는 것은 가로 이동, (x, y + 1), (x , y - 1)로 이동하는 것은 세로 이동이라고 한다.

정우는 그냥 (x1, y1)에서 (x2, y2)로 이동하는 것은 재미가 없다고 생각한다.

그래서 이전 이동이 가로 이동이었다면, 이번에는 세로 이동으로 이동하고, 이전 이동이 세로 이동이었다면, 이번에는 가로 이동으로 이동하여 (x1, y1)에서 (x2, y2)로 이동하려고 한다.

가장 첫 이동은 어떤 이동 이어도 상관 없다.

이 때, 최소 몇 번의 이동을 해야 (x1, y1)에서 (x2, y2)로 이동할 수 있는지 구하는 프로그램을 작성하라.

 

 

3. 제약사항

입력으로 주어지는 사람 네트워크에서 노드 자신을 연결하는 간선은 없다.

또한 사람 네트워크는 하나의 연결 요소(connected component)로 구성되어 있다.

단, 사람 네트워크의 최대 사용자 수는 1,000 이하이다.

테스트 케이스들은 아래의 그룹들로 이루어져 있다.
그룹 1 싸이클이 없고 N <= 10 인 경우
그룹 2 싸이클이 없고 10 < N <= 100 인경우
그룹 3 싸이클이 있고 N<= 10
그룹 4 싸이클이 있고10 < N <= 100
그룹 5 모든 경우가 존재하고 100 < N <= 1000

 

4. 입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 네 정수 x1, y1, x2, y2 (-100 ≤ x1, y1, x2, y2 ≤ 100)이 공백 하나로 구분되어 주어진다.

 

5. 출력

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

각 테스트 케이스마다 최소 몇 번의 이동을 해야 하는지 출력한다.

 

6. 풀이

- 코드 주석 참조.

7. 소스 코드

import java.io.*;
import java.util.*;

public class Solution {
	static int Min;
	
	static int x1, y1, x2, y2;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt(); // 테스트케이스 개수
		
		for(int tc=1;tc<=T;tc++) {
			x1 = sc.nextInt();
			y1 = sc.nextInt();
			x2 = sc.nextInt();
			y2 = sc.nextInt();
			
			Min = Integer.MAX_VALUE;
			
			//가로 출발
			go(false);
			
			//세로 출발
			go(true);
			
			System.out.printf("#%d %d\n",tc,Min);
		}
	}
	public static void go(boolean sign) {
		int nx = x1;
		int ny = y1;
		int count = 0; // 방향전환 횟수
		
		while(true) {
			if(nx==x2 && ny==y2) {
				if(count<Min) Min = count;
				break;
			}
			//가로 시작
			if(!sign) {
				//가로가 y2보다 크면 왼쪽으로 가라
				if(ny>y2) ny--;
				else ny++; //y2보다 작으면 오른쪽으로
				sign = true;
			}
			
			//세로 시작
			else {
				//세로가 x2보다 밑에 있으면 올라가
				if(nx>x2) nx--;
				
				//아니면 내려가
				else nx++;

				sign = false;
			}
			count++;
		}
	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기