본문 바로가기

Coding Tests/백준 온라인

( C )백준온라인 2525번

<문제>

https://www.acmicpc.net/problem/2525

 

<잘못된 풀이>

위 코드를 보면 입력받은 C 분을 60으로 나눈 몫과 나머지를 각각 A와 B에 더하도록 코드를 설정하였다. 

예를 들어 C = 80이라면 몫은 1이고 나머지는 20으로 A에 1시간을 더해준다 생각할 수 있고, B에 20분을 더하여 준다 생각할 수 있다. 그런데 이 부분에서의 오류가 있다. 바로, B의 값이, 예를 들어 50일 때 20을 더해주면 70이다. 이 70은 밑의 if문의 m = m - 60의 대입 연산에 의해 m값이 10으로 바뀌어 출력을 할 때에,

우리가 예상했던 '분(minute)'을 구할 수 있지만, 이 '분'이 60이 넘어가면 '시' 에 1을 더해주어야 하는데 위의 풀이로는 그렇게 구현을 해낼 수가 없었다. 그래서 자리올림을 생각해냈고, 아래와 같은 코드를 작성하였다. 

 

<정답 풀이>

#include<stdio.h>
int main(void) {
	int A, B, C;
	scanf("%d %d", &A, &B);
	scanf("%d", &C);
	int carry;
	int h;
	carry = (B + C) / 60;
	h = A + carry;
	
	if (h >= 24) {
		h -= 24;
	}
	printf("%d %d",h,(B+C)%60);
	return 0;
}

앞의 잘못된 코드에서는 A와B를 따로 생각하고 구현을 하려 했었다면, 이 풀이는 B에 의해 A가, 즉 '시(hour)'가 결정이 된다. B+C 가 60을 넘긴다면, 자리올림 carry의 값이 나오게 될 것이고, 이는 h의 값을 결정해준다. 

그리고 h>=24일때의 조건을 통해 문제의 조건에 맞는 '시'에 맞춰 바꿔 주도록 설정하였다. 

 

if문안에서 변경된 h의 값이, if문 밖에서도 유지되는 이유는 h -=24;의 문장에서 복합 대입 연산으로 h값을 변경하여주었기 때문이다. 꼭 복합 대입 연산이 아니더라도 h의 값에 영향(변동)을 준다면 h는 그 변동(대입)된 값으로 변경되게 된다.