목록EPPER (37)
궤도
문제 풀이 백트래킹 문제다. 도대체 어디에 백트래킹이 들어가냐고 물어본다면 팀 나눌 때 들어간다. 백준에서 비슷한 문제를 풀 때는 친절하게 인원은 모두 짝수라고 했었는데, 여긴 홀수도 있다. 뭐...그렇게 크게 달라진 부분은 없다. promising한 노드만 적었다. promising의 조건은 상위 노드보다 큰 index여야 한다는 것이다. 왜냐면 (0,1)/(2)랑 (1,0)/(2)는 차이가 없기 때문이다. 이런 방법으로 중복을 제거하면 조합같이 보인다. 이를 구현하기 위해 make_team 함수의 인자가 2개인 것이다. now는 상위 노드의 인덱스값을 알기 위해 사용하고, cnt는 그래서 지금 팀에 몇 명이 모였는지 알기 위해서 사용한다. 그러니 메인에서의 호출도 make_team(0, 0)인 것이다..
문제 풀이 스택을 처음 배울 때 한번쯤 보았을 후위표기법이다. 개념은 어렵지 않았으나, c에서 char 변수를 받을 때 주의해야 할 점을 까먹어서 좀 고생했다. 입력 예를 보면 알겠지만 중간중간 공백이 있다. character 단위로 입력을 받을 때는 공백도 입력으로 처리하기 때문에 입력을 처리할 input 변수와 더불어 공백을 처리할 empty 변수도 필요하다. m을 입력한 뒤 입력한 엔터도 char에 들어가니 저것도 empty 변수로 빼줘야 한다. 아무튼 첫번째 입력은 무조건 숫자일테니 char로 받은 숫자를 int로 바꿔서 num1 변수에 저장한다. 그 다음부터 반복문을 돌며 계산한다. 새로운 숫자가 입력된다면 int로 바꿔서 num2 변수에 저장한다. 그 이후에 연산자가 등장하면 해당 연산자에 따..
문제 풀이 C의 좌표와 반지름 r을 입력받고 적함대의 수만큼 그 정보를 배열에 저장한다. 그리고 각각의 적함대에 대해 dist함수를 호출해 길이를 구하는데, 다들 알겠지만 두 좌표의 거리를 구할 때는 마지막에 루트를 씌워야한다. 하지만 그렇게 하지 않고 제곱한 상태로 가져왔는데, 루트를 씌우는 과정에서 값이 손실돼 답이 달라질 수도 있기 때문이다. 거리를 제곱해서 가져왔으니 r도 당연히 제곱한 상태로 비교한다. 그리고 범위 안에 들어왔다면 cnt를 증가해서 최종 출력한다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #include #include int dist(int ax, int ay, int bx, int by) { //길이 구함. 루트 씌우면 숫자 달라지니까 그냥 제곱으로 ..
문제 풀이 간단한 369게임이다. 숫자가 2자리 이상이라면 자릿수를 하나하나 쪼개면서 3,6,9인지 확인하는데 36같은 경우 박수 횟수가 2번으로 체크되는 경우를 막기 위해 한자리라도 3,6,9라면 break를 사용해 바로 빠져나왔다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #include int main() { int S, E; int cnt = 0; scanf("%d %d", &S, &E); for (int i = S; i
문제 풀이 m월 d일을 입력하면 1월 1일로부터 며칠이 지나야 m월 d일이 될 지 계산하고 그 결과를 7로 나눠서 요일을 구했다. 처음엔 m월 1일마다의 요일을 구해서 저장할까...같은 노가다성이 짙은 생각을 했는데, 지금 생각해보면 제정신이 아니었나보다. 7월까지는 홀수 달이 31일이고 8월부터는 짝수 달이 31일이다. 1월부터 이에 맞춰 더해가다 m월이 되면 지금까지 더한 결과에 (d-1)을 더한다. 왜 d-1이나면 1월 '1일'부터 시작했기 때문이다. 최종 결과를 7로 나누고 나머지에 따라 switch문에서 해당 요일을 찾아줬는데 지금 생각해보니 차라리 요일을 배열에 저장했으면 코드가 더 짧아졌을 것 같다는 생각이 든다. char day[7][10] = {"일요일", "월요일", "화요일", "수요..