엑셀의 첫 번째 열은 A이고, 두 번째 열은 B이고, 26번째 열은 Z이다. 26번째 열 다음 열부터는 2글자를 이용한다.
예를 들어, 27번째 열은 AA이고, 28번째 열은 AB, 52번째 열은 AZ이다. 그 다음 53번째 열은 BA이며, 이와 같이 계속 열의 이름을 붙인다.
ZZ열 다음 열은 AAA가 되고, 그 다음은 AAB가 된다.
엑셀에서 행은 그냥 행 번호를 사용하면 된다.
엑셀 스프레드시트에서 각 칸은 위에서 설명한 열과 행을 합쳐서 이름을 만들 수 있다. 가장 왼쪽 위에 있는 칸은 A1이 되고, 55열 23행에 있는 칸은 BC23이 된다.
열과 행이 주어졌을 때, 그 칸의 엑셀 스프레드시트 상에서 이름을 출력하는 프로그램을 작성하시오.
입력은 여러 줄이며, RnCm형태이다. n은 행 번호 (1<=n<=300000000), m은 열 번호 (1<=m<=300000000) 이다. 입력의 마지막은 n과 m이 모두 0이며, 이때는 출력하지 않고 프로그램을 종료하면 된다.
각 입력을 순서대로 한 줄에 하나씩 엑셀 스프레드시트 상에서의 이름을 출력하면 된다.
R1C1
R3C1
R1C3
R299999999C26
R52C52
R53C17576
R53C17602
R0C0
A1
A3
C1
Z299999999
AZ52
YYZ53
YZZ53
문제 풀이 방법이 생각나지 않아 1시간 넘게 고민했다가 안풀려서 타 풀이를 참고하였다.
진법 문제라고 생각은 했지만, A-Z 가 1-27에 대응되다 보니, 나머지가 0일 경우에 어떻게 처리해야 하는지가 떠오르지 않았다.
이를 해결하기 위해서는 26으로 나눈 나머지가 0일 경우 몫에서 -1 을 하고, 나머지를 26으로 만들어주면 된다. 이렇게 하면 나머지가 26이 되므로 Z에 대응시킬 수 있다.
그외에 나머지가 0이 아닌 경우(1-25)는 그대로 1-25 -> A-Y 에 대응해주면 된다.
풀이
딕셔너리와 index 함수가 사용되었다.
num_to_alpha = {i: chr(64+i) for i in range(1, 27)}
while True:
ans = []
cell = input()
n, m = int(cell[1:cell.index('C')]), int(cell[cell.index('C')+1:])
if n == 0 and m == 0 :
break
while m > 0:
mok = m // 26
na = m % 26
if na == 0:
mok -= 1
ans.append(num_to_alpha.get(26))
else:
ans.append(num_to_alpha.get(na))
m = mok
print(''.join(reversed(ans)) + str(n))