비전공자로 살던 제가 SSAFY를 준비하면서, 처음으로 티스토리 계정을 만들고, 글을 쓰면서 내 개발 공부에 기록을 남기게 되었습니다. 특히나 알고리즘에 관하여 CT시험 준비를 통해 처음 배우게 되면서 정확히 맞지는 않더라도 내 풀이를 기록해 놓아야 그때에 내가 얼마나 잘 알고 풀었는지 아니면, 모르고 대충 풀었는지 알 수 있을 것 같은 마음에 오늘부터 백준 문제를 몇 개 가져와서 풀이를 남겨보려고 합니다.
기초를 잘 알지 못하는 비전공자에 개발 초심자로서 쓴 글이기 때문에 제 글을 보시는 분들이 부디 제 풀이를 맹신하여 풀거나, 너무 큰 비난을 하지는 않아주셨으면 합니다. 다만, 잘못된 풀이에 대해서는 언제든지 (매너만 지키신다면) 댓글로 남겨주시면 감사하겠습니다!
19940번: 피자 오븐
각각의 테스트 케이스마다 5개의 정수를 한 줄에 공백으로 구분해서 출력한다. 이 정수는 입력으로 주어진 시간을 만들기 위해서 ADDH, ADDT, MINT, ADDO, MINO 버튼을 누르는 횟수를 출력한 것이다. 최
www.acmicpc.net
문제 설명)
이 문제는 피자를 데우기 위한 적정 시간에 맞추어 최소의 버튼을 눌러 해당 시간을 맞추는 방법을 출력하는 문제입니다.
오븐의 버튼은 총 5가지가 있는데, 다음과 같습니다.
1. ADDH : + 60
2. ADDT : + 10
3. MINT : - 10
4. ADDO : + 1
5. MINO : - 1
문제 풀이)
저는 일단 주어진 시간의 일의 자리를 반올림 한 뒤 버리고, 60과 0에서 어디에 가까운지를 먼저 확인했습니다. 예를 들면 55의 경우 (일의 자리를 반올림한 뒤 버리면 50이 됩니다.) 50은 60과 0 중에서 당연히 60에 더 가까우므로, (60 : 0 +60 -10 / 0 : 0 +10 +10 +10 +10 +10) 60을 먼저 더하는 것으로 생각하면 됩니다. 그 이후에 일의 자리를 고려하면 되는데, 보통 0~4까지는 해당 수보다 큰 10의 배수에서 1씩 빼는 것보다 더 작은 10의 배수에서 1씩 더해가는 편이 빠르고, 반대로 6보다 크다면 해당 수보다 큰 10의 배수에서 1씩 빼는 편이 더 빠르므로 그런 과정을 거치면 됩니다. 다만, 55같이 5인 경우에는 이 전의 과정에서 해당 수(55) 보다 더 큰 수를 만들었다면 위에서 빼는 편이 빠르고, 반대로 작은 수부터 시작했다면 더하는 편이 빠른 경우의 수가 될 것입니다. 예를 들면 55는 이미 이 전의 과정에서 우리가 60을 더해 55보다 큰 수부터 시작하므로, 60에서부터 -1을 다섯 번 하는 것이 최고로 빠른 방법입니다. (반대로 50에서 +1을 더하는 것도 5번이지만, 먼저 60에서 -10을 하는 과정을 거치므로 결국 60에서 빼는 편이 더 빠릅니다.) 즉, '55'의 경우는 +60 -1 -1 -1 -1 -1로 타이머를 맞추는 것이 최소 횟수가 되겠습니다.
같은 방법으로 27을 예로 풀어보면, 27을 반올림한 30은 +60 -10 -10 -10보다 +10 +10 +10이 더 빠른 경우이므로 0에서 더해가기로 하고, 일의 자리 7은 6 이상이므로 일단 30까지 더한 뒤에 1을 세번 빼는 식으로 풀면, +10 +10 +10 -1 -1 -1 총 6번이 가장 최소의 횟수로 27을 맞추는 방법임을 알 수가 있습니다.
'Algorithm > Computational Thinking' 카테고리의 다른 글
BOJ 2516 (원숭이) - CT 풀이 (0) | 2022.05.19 |
---|---|
BOJ 2533 (사회망 서비스(SNS)) - CT 풀이 (0) | 2022.05.18 |
BOJ 21758 (꿀 따기) - CT 풀이 (0) | 2022.05.16 |