JS-알고리즘 Leetcode(Easy)-Excel Sheet Column Title
포스트
취소

JS-알고리즘 Leetcode(Easy)-Excel Sheet Column Title

Question

Given an integer columnNumber, return its corresponding column title as it appears in an Excel sheet.

대충 해석

정수인 colunmNumber에 따라 해당하는 엑셀 시트의 컬럼 타이틀을 리턴하세요.

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#Sample
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

#1
Input: columnNumber = 1
Output: "A"

#2
Input: columnNumber = 28
Output: "AB"

#3
Input: columnNumber = 701
Output: "ZY"

고려해야할 부분

제약조건이 정말 중요하다. columnNumber의 범위를 1 <= columnNumber <= 231 - 1 로 제한하는데 0이 아닌 1부터 주어진다는 점에 유의해야한다.
사실은 base-10 표기를 이용한 base-26이였던 것..! 정도로 이해하면 좋다.
보통 문제를 풀 때 시간을 정해두고 푸는데 급하게 푼 나머지 영 개판이라 이후 풀이를 고치며 정리한 생각을 아래에 작성했다.

예시를 보면 A~Z까지 26개에 1~26의 숫자를 할당하고 있다. 이를 예시로 주어진 것보다 조금 더 그려보자.

 AB
012
A2753
B2854
C2955
D3056
E3157
Y5177
Z5278

적당히 그려보고 나면 규칙을 바로 찾을 수 있을 것이다.

BA2 * 26 + 1
BB2 * 26 + 2
BY2 * 26 + 25
BZ2 * 26 + 26

이를 참고해서 AAZ를 식으로 표현해보자면 아래와 같이 대강 식을 세울 수 있다.
n = (A * 26^2) + (A * 26^1) + (Z * 26^0) => n = (1 * 26^2) + (1 * 26^1) + (26 * 26^0)
처음 풀이에선 이 식을 그대로 사용하고 나머지가 0일 경우를 따로 처리했었는데..(라고 쓰고 바보라고 읽음)
고민을 하다보니 어차피 나머지 이용할거 굳이 그렇게 할 필요가 없다는 걸 깨달았다.
(ZZZ=Z×26^2+Z×26^1+Z=26×26^2+26×26^1+26^0 같은 경우 위처럼하면 좀 귀찮음)
1~26을 그대로 사용하는 것이 아니라 0~25로 이동시킨 후 나머지를 이용하면 보다 간단하게 처리할 수 있다.

맨 처음 풀이가 Solution 1이며 그 후 정리한 풀이가 Solution 2이다.


Solution 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var convertToTitle = function(columnNumber) {
    // 1회차 풀이
    columnNumber = 52;

    let remain = 0;
    const charcode = [];

    while(columnNumber > 0) {

        remain = columnNumber % 26;

        if(remain === 0) {

            let checkCode = columnNumber + 64;
            if(checkCode > 97)  {
                checkCode = (columnNumber / 26) + 63;
                charcode.push(90);
            }
            charcode.unshift(checkCode);

            break;
        }

        charcode.unshift(remain+64);
        columnNumber = (columnNumber - remain) / 26;

    }

    console.log(String.fromCharCode(...charcode));

};

Solution 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var convertToTitle2 = function(columnNumber) {
    // 1회차 풀이 코드 정리
    columnNumber = 52;

    let remain = 0;
    const charcode = [];

    while(columnNumber > 0) {

        remain = (columnNumber -= 1) % 26;
        charcode.unshift(remain + 65);
        columnNumber = (columnNumber - remain) / 26;

    }

    console.log(String.fromCharCode(...charcode));

};
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

JAVA-알고리즘 Leetcode(Easy)-Sqrt(X)

JS-알고리즘 Leetcode(Easy)-Best Time to Buy and Sell Stock