-
C++] 백준 5622번 다이얼Algorithm 2024. 11. 25. 15:15
백준 문제 : https://www.acmicpc.net/problem/5622
제출한 답
#include <iostream> #include <string> using namespace std; int main() { string input; int second = 0; cin >> input; for (char s : input) { if (s >= 'A' && s <= 'C') { second += 3; } else if (s >= 'D' && s <= 'F') { second += 4; } else if (s >= 'G' && s <= 'I') { second += 5; } else if (s >= 'J' && s <= 'L') { second += 6; } else if (s >= 'M' && s <= 'O') { second += 7; } else if (s >= 'P' && s <= 'S') { second += 8; } else if (s >= 'T' && s <= 'V') { second += 9; } else if (s >= 'W' && s <= 'Z') { second += 10; } } cout << second; }
자세한 풀이
string은 char의 배열인 형태이므로 for문을 이용해 한 글자씩 가져와서 해당 값을 찾아줬다.
숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
라고 쓰여져 있으니 숫자 2(A,B,C)는 3초가 걸리고 숫자 3(D,E,F)는 4초가 걸린다. 입력에 해당하는 시간 초를 모두 더하면 끝!
여기서 for ( char s : input) 이라고 적었는데 input 배열을 순회하며 각 값을 s에 복사해 넣어주는 for 문이다. 이는 "범위 기반 for문" 이라고 불리며 자세한 내용은 '참고한 자료' 속 링크
for ( char& s : input) 이나 for (const char& s : input) 이렇게 참조값과 상수값을 사용하여 안전성과 메모리에 효율적인 연산을 할 수 있다.
추가 내용
#include<iostream> using namespace std; int main() { string a; // 문자열 입력 변수 cin >> a; int time[] = { 3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,8,9,9,9,10,10,10,10 }; // 시간 배열 int result = 0; // 최종 값 for (int i = 0; a[i] != NULL; i++) { result += time[a[i] - 'A']; } cout << result << endl; }
근데 수많은 사람들이 위와 같은 방법으로 문제를 푸는 것을 발견했다. 왜 이렇게 풀었을까 보니 코드 길이와 시간이 단축 되어서 그런가보옴... 내껀 else if 도배였는데...
time 배열의 각 값들은 문제에서 제시한 각 알파벳(숫자)에 해당하는 시간 초였다.
따라서 { 3, 3, 3, 4, 4, 4, 5, 5, ... } 는 { A, B, C, D, E, F, G, H, ... } 에 해당한다.
i 를 a[i] != NULL 로 제한두어 입력값 길이에 맞게 for문이 작동하도록 하고 string은 char의 배열!
time[ a [i] - 'A' ] 를 더하여 답을 구했다.
time [ a[i] - 'A'] 를 해석하자면,
입력받은 string a가 만약 ABC 라면
i가 0 일 때, time [ a[0] - 'A'] == time [ 'A' - 'A' ] 가 되는 것이다.
'A' 는 아스키코드 10진수 값으로 65에 해당하며 'A' - 'A' 는 65 - 65 = (int)0 로 계산이 된다.
그러면 time [ 0 ] 값을 불러오게 되는 것이고, time[0]은 3 이므로 3초를 더하게 된다.
i가 1이면 time [ a[1] - 'A'] == time [ 'B' - 'A' ] == time [ 66 - 65 ] == time [ 1 ] == 3
어떻게 이런 생각을 하지?
반응형'Algorithm' 카테고리의 다른 글
C++] 특수 문자 출력하기, Raw 문자열 (0) 2024.11.22 C++] 대문자, 소문자 바꿔서 출력하기 (0) 2024.11.21