"꾸준하고 완벽한 한 걸음"

전체 글 784

[백준 2920] 음계 [C]

풀이 항상 1부터 8까지 8개의 수가 입력되고, 오름차순 또는 내림차순으로 정렬되어있는지 아닌지를 확인하면 된다. 때문에, 반복문 내의 변수 i값의 증가를 이용해 확인할 수 있다. ascending 또는 descending라면 입력된 수들의 처음과 끝수의 합이 항상 9 이다. 1 ~ 4번째 수가 i + 1과 동일하다면, ascending이다. (5~8번째 수의 쌍은 위 조건에서 만족한다.) 처럼 풀이하는게 문제의 출제의도이나, 입력되는 수들을 하나의 문자열로 생각하면 쉽게 해결할 수 있다. ??? : 숫자가 주어진다 했지 문자열이 아니라고는 안했다. 하지만, 이 방법은 비교할 문자열을 직접 작성 또는 생성을 해야 하므로 간결하면서도 무식한 방법이라고 볼 수 있다. 만약 숫자가 1부터 100이라면? 소스코..

[백준 10866] 덱 [C]

풀이 Deque(Double Ended Queue)는 Stack와 Queue의 특징을 모두 갖는 이중 연결 리스트(Doubly Linked List)의 구조이다. 쉽게말해 방향이 반대인 Stack 두개를 붙인 것과 같다. 역방향 Stack 0 1 " " " 4998 4999 front 정방향 Stcak 5000 5001 " " " 10000 10001 rear 역방향 Stack과 정방향 Stcak를 합치고, 중간 index(4999~5000)에서 front를 감소, rear를 증가시키는 방식으로 구현했다. 0 1 " " " 4998 4999 5000 5001 " " " 10000 10001 front rear 단, front와 rear이 일치하는 경우는 없다는 점에 유의하자. front + 1이 rear..

[백준 2884] 알람 시계 [C]

풀이 M이 45 이상일 때, 입력된 시간에서 45분만 빼면된다. M이 45 미만일 때, H가 1~24 일때 H -= 1이고, H가 0일때는 23으로 변경되어야 한다. 입력된 M의 값에 상관없이 60을 더하고 45을 뺀 값을 60으로 나누었을 때 나머지를 사용하면 짧게 표현할 수 있다. 소스코드 #include int main() { int H, M; scanf("%d %d", &H, &M); if (M < 45) H = (H != 0 ? H-1 : 23); printf("%d %d", H, (M+15) % 60); } 출처 2884번: 알람 시계 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모..

[백준 2753] 윤년 [C]

풀이 윤년일 조건은 다음과 같다. year % 4 == 0 && year % 100 != 0 year % 400 == 0 윤년인지 아닌지의 조건에 따라 1(True), 0(False)를 출력하면 된다. &&와 || 는 우선 연산에 따라 계산되므로 따로 괄호를 할 필요는 없다. 소스코드 #include int main() { int year; scanf("%d", &year); printf("%d", !(year%4) && year%100 || !(year%400)); } 출처 2753번: 윤년 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서 ww..

[백준 2675] 문자열 반복 [C]

풀이 반복횟수 R과 문자열 S를 입력받아 문자열의 각 문자가 R만큼 연속되는 새로운 문자열을 출력하면 된다. 문자열을 만들어서 출력하나, 문자를 하나씩 찍어서 출력하나 동일하다. 소스코드 #include int main(){ int T, R; char S[21]; scanf("%d", &T); while (T--){ scanf("%d %s", &R, S); for(int i = 0; i < S[i] != '\0'; i++) for(int j = 0; j < R; j++) putchar(S[i]); putchar(10); } } 출처 2675번: 문자열 반복 문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두..

[백준 2577] 숫자의 개수 [C]

풀이 A*B*C를 10으로 나누었을 때 나머지는 1의 자리만 남는다. 남는 수에 해당하는 배열의 index를 증가시키면 0~9의 숫자가 각각 몇 번 쓰였는지 알 수 있다. 1의 자리의 수를 알아낸 후 result를 10으로 나눈 결과에 10으로 나누었을 때의 나머지를 구하는 과정을 반복하면 된다. 소스코드 #include int main() { int A, B, C; scanf("%d %d %d", &A, &B, &C); int result = A*B*C, num[10] = { 0, };; while (result != 0){ num[result % 10]++; result /= 10; } for (int i = 0; i < 10; i++) printf("%d\n", num[i]); } 출처 2577번:..