A -> 1, B -> 2, C -> 3, ..., Z -> 26, AA -> 27, AB -> 28,...과 같은 원리로 문자를 바꿔야 한다.
딱 보기에도 규칙이 보이지만 코드로 써 보려니 어려웠다.
뼈대 코드
#include <stdio.h>
#include <string.h>
int col_to_num(char col[]) {
int len = strlen(col);
long long num = 0;
int i=0;
while (i<len) {
// write code
}
return num;
}
int main(void)
{
char col1[] = "C";
printf("Col %s -> %d\n", col1, col_to_num(col1));
char col2[] = "AC";
printf("Col %s -> %d\n", col2, col_to_num(col2));
char col3[] = "ZY";
printf("Col %s -> %d\n", col3, col_to_num(col3));
}
write code 부분에 쓰면 되는데, 처음에는 일단 해 보자고 해서 아무렇게나 짰다.
int col_to_num(char col[]) {
int len = strlen(col);
long long num = 0;
int i=0;
while (i<len) {
char c=0;
if (len==2 && i==0) {
c = (col[i] - 64) * 26;
} else {
c = col[i] - 64;
}
num += c;
i++;
}
return num;
}
조건도 더럽고 한정적이지만 일단 정답을 내 보고 하자고 해서 했는데,
int는 4바이트이고 char은 1바이트라서 26*26을 하는 바람에 오버플로우가 발생했다.
num에 26을 곱해서 그걸 다시 num에 넣는 것으로 시작해서
배열의 인덱스가 증가할 때마다 그 캐릭터(char)에 맞는 숫자를 더한 다음
다음 루프 때 26을 곱해 주고
이런 식으로 26진법을 쓰듯이 진행한다.
정답 코드
int col_to_num(char col[]) {
int len = strlen(col);
long long num = 0;
int i=0;
while (i<len) {
num *= 26;
num += col[i] - 'A' + 1;
i++;
}
return num;
}
'Programming Language > C' 카테고리의 다른 글
[C] 구조체 struct (0) | 2024.03.13 |
---|---|
[C] 포인터 선언과 역참조 (0) | 2024.03.11 |
[C] 포인터 연산 (0) | 2024.03.11 |
[C] C언어의 스토리지 클래스(기억 영역, Storage Class) (0) | 2024.03.07 |
[C] 실수 자료형 float, double 소수점 출력 범위 지정 (1) | 2024.03.06 |