https://www.acmicpc.net/problem/2309
문제
왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.
아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.
아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.
입력
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
출력
일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다.
출처
Olympiad > 한국정보올림피아드 > 한국정보올림피아드시․도지역본선 > 지역본선 2004 > 초등부 1번
알고리즘 분류
5년 전 풀었던 알고리즘 문제로.. 당연히 풀었던 기억이 없다.
C99 로 풀었다는건 무엇일까..
지금 보면 알고리즘이 처참할 것 같다... 5년전이면.. 대학교 3학년 일것 같다.
#include<stdio.h>
#include<string.h>
#define swap(a,b) { int t = a; a = b; b = t;}
int main(){
int arr[9];
int h = 0;
int res = 0;
for(int i = 0 ; i < 9 ; i++){
scanf("%d",&arr[i]);
h+=arr[i];
}
int end = 0;
while(end!=8){
if(arr[end] > arr[end+1]){
swap(arr[end],arr[end+1]);
end = 0;
}else
end++;
}
int h100 = h - 100;
int a,b;
for(int i = 0 ; i <9 ; i++){
for(int j = i+1 ; j < 9 ; j++){
if(h100==arr[i]+arr[j]){
a = i;
b = j;
break;
}
}
}
for(int i = 0 ; i < 9 ; i++){
if(i != a && i !=b)
printf("%d\n",arr[i]);
}
}
이제 어느정도 성숙한 개발자가 되어 이 코드를 보니... 오히려 이때가 더 열심히 짜려고 했나 싶기도 하고.. ㅎ
내가 이런것도 풀 수 있었나 생각도 든다... 공부를 게을리 하니 아니 알고리즘 공부를 안 하니 어떻게 풀어야 하는지도 기억이 잘 나지 않는 것 같다.
역시 알고리즘은 공부의 영역이다. 솔직히 현업에서는 이러한 알고리즘이 대체로 쓰이지 않는다.
물론 내가 지금 위치한 산업에서 쓰지않는 것일 수 있어 내 의견이 전체를 대변하지는 않는다. 하지만 요즘 알고리즘 공부는 취업에 목적이 더 강한 것 같다는 느낌이다.