[Baekjoon 파이썬] 14652번: 나는 행복합니다~


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

 

14652번: 나는 행복합니다~

첫째 줄에 관중석의 크기를 나타내는 N, M과 잃어버린 관중석 번호를 나타내는 K가 주어진다. (1 <= N, M <= 30,000, 0 <= K <= N*M-1)

www.acmicpc.net

 

문제 설명

N, M(행,열)이 주어지고 표에 적혀있는 좌석번호를 입력으로 좌표 (n,m)을 출력하는 문제입니다.

왼쪽 위부터 (0,0)으로 주어지고 만약에 좌석번호 5번의 경우에는 (1,1)로 찾을 수 있습니다.

 

 

소스코드 & 설명

이런 문제들은 기본적으로 좌석번호의 규칙을 찾아내야 합니다.

 

가급적이면 반복문으로 해결하는것보다 수학적 규칙으로 찾아내야 하고 반복문으로 해결한 경우 십중팔구 대부분이 시간 초과가 뜨게 됩니다.

 

좌석번호를 자세히 보시면

 

우선 0,1,2,3 까진 n좌표는 0이고 m좌표는 입력한 좌석번호 그대로 임을 알 수 있습니다.

즉 좌석번호가 M보다 작을땐 (0,좌석번호) 로 그대로 출력합니다.

 

그 다음의 규칙을 찾는게 좀 시간이 걸렸는데 4,8을 M으로 나눈몫을 보면 이것이 n의 좌표가 되게 됩니다.

그리고 또 다시 M으로 나눈 나머지를 보면 이것이 바로 m의 좌표가 됨을 알 수 있습니다.

(처음에는 m의 좌표를 찾기 위해 N으로 나눠보다가 좀 해맸습니다)

 

이것을 코드로 옮겨보면 다음과 같습니다.

 

n,m,k = map(int , input().split())
if k <= m-1: #번호가 M보다 작으면
    print(F"0 {k}") #그 숫자가 곧 좌표
else: #아닐경우
    n_location = k // m #값을 M으로 나눈것의 몫이 곧 n의 좌표.
    m_location = k % m #요건 나머지
    print(n_location, m_location)

 

그리고 생각해보니 굳이 M보다 작은걸 검사할 필요가 없었습니다.

0,1,2,3의 경우에도 M으로 나눈몫과 나머지가 곧 좌표가 됩니다.

ex) 2는 0,2인데 4로 나눈몫은 0이고 나머지는 2입니다.

 

n,m,k = map(int , input().split())
n_location = k // m #값을 M으로 나눈것의 몫이 곧 n의 좌표.
m_location = k % m #요건 나머지
print(n_location, m_location)

그래서 최종적인 코드는 다음과 같습니다.

COMMENT WRITE