Algorithm/백준

[백준] 1193번: 분수찾기

창모의 개발사전 2025. 8. 4. 18:00

 

이번 문제는 백준 난이도 실버5 '분수찾기' 문제이다.

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

 

문제의 조건은 나와있는 그림의 분수처럼 위치해 있는 2차원 배열맵에서 지그재그로 이동해야한다.

→  그림으로 표현하면 이런 식으로 이동한다는 뜻이다.

 

그런데 맵을 자세히 보면 분수형태로 표현되어있지만 이건 곧 원소의 위치를 나타내는 것이기도 하다.

→  행/열 형태.

 

즉, 2차원 맵을 지그재그로 이동하며 이동 시마다 값이 1씩 증가하게 되는 규칙을 따른다. 그렇게 한 숫자를 입력했을 때 해당 숫자가 위치한 행/열 주소를 출력하는 문제다.

 

규칙을 보면 대각선으로 이동하며 각 각 층으로 나눠 표시할 수 있을 것 같다.

이런식으로

그리고 층이 증가할 수록 해당 층의 원소 갯수가 1씩 증가한다.

Ex) 1층 : 1개, 2층 : 2개, 3층 : 3개 ... n층 : n개

→ 1개, 2개, 3개 ... n개 의 규칙이 생긴다.

 

여기서 우리는 누적합 공식을 이용해 문제를 해결할 수 있다.

입력값 X가 주어지고 각 층별의 원소 갯수 값을 누적해서 더한다.

예로 X가 14라고 한다면

누적합 : 1 + 2 + 3 + 4 + 5 = 15 이렇게 1층 2층 3층 4층 5층까지의 원소 갯수들을 차례차례 더하면 15라는 값이 나오고

이 값은 입력값인 X 14보다 커지니 X는 15값인 5층에 존재한다.

→ 4층은 최대 크기가 10이기 때문에 14는 들어갈 수 없기 때문

 

즉 이 상태에서 입력값 X에 이전 층의 마지막 인덱스인 10 (4층 원소 구간 : 7 ~ 10)을 빼주면

5층에서의 입력값 위치를 알 수 있다. 

 

여기서 X - 4층의 누적합을 빼면 5층에서 4번째 원소가 입력값의 분수값(주소)임을 알 수 있다.

 

이제 코드로 과정을 나타내보자


 

[Python]

 

입력값 X를 받은 후,

우선 층을 나타내는 layer변수, 누적합을 저장하는 sum이란 변수를 생성한다.

X가 sum보다 클 때까지 반복을 한다. 

결론적으로 X가 14라면 layer는 5이고 누적합은 15가 된다. 

X = int(input())

layer = 1
sum = 1
while X > sum:
    layer += 1
    sum += layer

 

여기서 ※ 현재 층의 위치를 계산하기 위해 누적합에 현재 층 5의 값을 빼준다.

15 - 5 = 10

sum -= layer

 

if layer % 2 == 0:
    top = X - sum
    bottom = layer - (X - sum) + 1
else:
    top = layer - (X - sum) + 1
    bottom = X - sum

 

대각선을 지그재그로 이동하기 때문에 문제의 조건에 따라 첫원소 이후 오른쪽 원소부터 이동을 시작하며 지그재그로 이동한다.

그러면 짝수 layer일 때는 대각선 윗방향, 홀수 layer일 때는 대각선 아래방향으로 이동한다는 규칙을 찾을 수 있다.

 

대각선 윗방향(짝수)일 때는 분모가 커지고 분자가 작아진다.

대각선 아랫방향(홀수)일 때는 반대이다.

조건에 맞춰 layer - (X - sum) + 1과  X - sum의 식을 통해 분수값을 구한다.

 

<전체코드>

X = int(input())

layer = 1
sum = 1
while X > sum:
    layer += 1
    sum += layer

sum -= layer

if layer % 2 == 0:
    top = X - sum
    bottom = layer - (X - sum) + 1
else:
    top = layer - (X - sum) + 1
    bottom = X - sum

print(f"{top}/{bottom}")

출력 결과

출력 결과 14의 위치에 해당하는 2/4라는 분수값을 얻을 수 있다.

 

 

 

 

 

추가로, 누적합의 역으로 누적값을을 빼면서 찾는 방식도 있다.

X에 layer마다 각 원소갯수를 누적해서 빼주면 X가 layer보다 작아질때가 생기는데 그 때의 layer가 X값이 위치하는 layer이다.

동일하게 짝수층, 홀수층을 나누어 표시한다.

X = int(input())
layer = 1
while X > layer:
    X -= layer
    layer += 1

if layer % 2 == 0:
    top = X
    bottom = layer - X + 1
else:
    top = layer - X + 1
    bottom = X

print(f"{top}/{bottom}")

'Algorithm > 백준' 카테고리의 다른 글

[백준] 4134: 다음 소수  (1) 2025.08.09
[백준] 1436번: 영화감독 숌  (2) 2025.08.06
[백준] 2839번: 설탕 배달  (4) 2025.08.05
[백준] 1316_그룹 단어 체커  (2) 2025.08.02
[백준_BOJ] 10828번 : 스택  (1) 2024.10.03