J 크 2023. 7. 24. 22:56
728x90
반응형

https://www.acmicpc.net/problem/1193

 

1193번: 분수찾기

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

www.acmicpc.net

점점 아주 조금씩이지만 익숙해져 가는게 느껴지네요. A+B도 틀렸었는데,, 감격..


 해당 문제는 지그재그 순서로 배열을 탐색하는 문제로,  아래의 표와 예시를 통해 이해하시는게 더 빠를 것 같습니다!

 

 위와 같이 각 배열 원소에 분수를 가지고 있으며 파란색 번호 순서에 맞추어 탐색을 진행하며, 입력 받은 숫자에 해당하는 위치에 있는 분수를 출력하는 문제입니다. 혹시 이해가 안된다면 아래의 입력(Input) 과 출력(Output) 예시를 참고 부탁드리겠습니다. 

Example :

Input : 1 = > Output : 1 / 1

Input : 2 = > Output : 1 / 2

Input : 3 = > Output : 2 / 1

Input : 4 = > Output : 3 / 1

Input : 5 = > Output : 2 / 2

Input : 6 = > Output : 1 / 3

Input : 7 = > Output : 1 / 4

Input : 8 = > Output : 2 / 3

...


 문제에선 분수로 설명하였지만, 저같은 경우 분수로 보지 않고 '/' 기준 왼쪽을 X, 오른쪽을 Y로 놓고 생각하여 풀었습니다. 

코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

 대각선의 끝에 도달 시, 다음 대각선으로 이동.

▶ 배열의 [0][0]위치를 1번 대각선으로 정의 후, 홀수번째 대각선은 X=1,Y= 해당 대각선의 길이 부터, X++, Y--

배열의 [0][0]위치를 1번 대각선으로 정의 후, 짝수번째 대각선은 X=해당 대각선의 길이 ,Y = 1부터 X--, Y++

입력한 곳에 도달 시 멈추고 X/Y 출력

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.OutputStreamWriter;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int nTarget = Integer.parseInt(st.nextToken());
		
		int X = 1;
		int Y = 1;
		
		// 1일 경우 return;
		if(nTarget == 1) {
			bw.write(X + "/" + Y);
			bw.flush();
			bw.close();
			return;
		}

		int nIndex = 1;	// 각 대각선의 순서
		int nNum = 1; 	// 각 대각선의 길이
		int nCount = 1; // N번째 분수
		
		while(nCount < nTarget) {
			if(nIndex == nNum) {
				nIndex = 1;
				nNum++;
				if(nNum % 2 == 0) {
                	// 짝수 번째 대각선 첫번째 값
					X = 1;
					Y = nNum;
				}
				else {
                	// 홀수 번째 대각선 첫번째 값
					X = nNum;
					Y = 1;
				}
			}
			else if(nNum % 2 == 0) { // 짝수 번째 대각선
				X++;
				Y--;
				nIndex++;
			}
			else if(nNum % 2 == 1) { // 홀수 번째 대각선
				X--;
				Y++;
				nIndex++;
			}
			nCount++;
		}
		
		bw.write(X + "/" + Y);
		bw.flush();
		bw.close();
	}
}

 스터디 팀원과의 공유를 위해서 조금 더 자세하게 적도록 노력하였습니다. 모르고리즘 화이팅(?!)

긴 글 읽어주셔서 감사합니다!

Good Luck! (피드백 고맙습니다)