프로그래머스 160586.대충 만든 자판
프로그래머스의 문제 풀이 과정을 공유드린다.
문제 출처
1. 문제설명
- 자판에 대한 가중치(몇번 눌러야 하는지?)가 주어짐.
- 알파벳에 해당하는 가중치는 여러번 주어질 수 있음.
- 그 중 가장 작은 가중치로 설정했을 때 카운팅 결과
2. 알고리즘 설계
- 알파벳은 26개 이므로 배열[26]을 선언하고 가중치 할당
- 제한사항을 살펴보면 주어지는 keymap 원소의 길이는 최대 100
- 따라서 가중치를 미리 101로 설정해두고 101보다 작다면 갱신
- 알파벳의 가중치가 101이라는 뜻은 없는 알파벳이란 뜻이므로, 이걸 이용해 -1을 위한 예외처리
3. 로직
- 가중치 할당
- fill_n은 std namespace에 있는 함수로 (배열, 크기, 원하는 값)을 넣어 사용할 수 있음!
- 나는 처음에 memset()이란 함수를 사용했는데, 값이 이상해서 검색해보니 0으로만 초기화 가능하다고 함.
- string은 char의 조합이므로, ‘A’를 빼주면 index로써 사용가능하다.
- 아스키코드 값인데, ‘A’의 아스키코드 값이 뭐든 간에 ‘A’-‘A’는 0이니까
- 즉, A에 해당하는 가중치는 arr의 0번째 위치에 갱신
- (참고) 마지막 라인은 3항 연산자로, if-else 문을 한줄로 쓸 수 있어서 유용하게 사용 중!
int arr[26] = { 0 }; void allocate(vector<string> keymap) { fill_n(arr, 26, 101); for (int i = 0; i < keymap.size(); i++) for (int j = 0; j < keymap[i].size(); j++) { int idx = keymap[i][j] - 'A'; arr[idx] = (arr[idx] <= j) ? arr[idx] : j + 1; } }
- fill_n은 std namespace에 있는 함수로 (배열, 크기, 원하는 값)을 넣어 사용할 수 있음!
- 카운팅
- 101이라면 없는 글자라서 값이 갱신이 되지 않은 것을 뜻함.
- 101로 초기화했고, 최대길이가 100이기 때문에
- 아니라면 최소값을 계속해서 더해줌.
if (arr[idx] == 101) { answer[i] = -1; break; } else answer[i] += arr[idx];
- 101이라면 없는 글자라서 값이 갱신이 되지 않은 것을 뜻함.
- 전체 코드
- 소감
- fill_n 함수 매우 유용할듯, 앞으로는 0 초기화도 fill_n으로 사용해서 익숙해져야 할듯함.
- 문제 조건을 중간에 깨달아서 좀 오래 걸렸는데, 난이도 자체는 레벨 1이 맞는 거 같음.