목록백준 (46)
먹었으면 뇌를 쓰자

문제 막힌 코드 (a*b)를 for문을 통해 n번만큼 더하고 이것을 x와 비교해서 if문을 통해 같으면 Yes, 다르면 No를 출력하는 구조는 이해가 갔다. 그런데 (a*b)를 n번만큼 더한다는 코드를 어떻게 짜야할지 몰랐다. 정답 구글링을 통해 "(a*b)를 n번만큼 더한다"는 코드를 쓰지 않고 푸는 방법을 찾았다. - 총 금액(total)과 총 개수(count)를 Scanner 클래스로 입력받는다 - for문 안에서 물건 가격 a(price)와 물건 개수 b(num)를 Scanner 클래스로 입력받는다 ★ for문 밖에서 total, count와 함께 한번에 입력받는 코드도 실행해봤는데 되지 않았다. price와 num이 i

문제 정답 이번 문제는 정답에 비해 상당히 많은 시간을 써버렸다. sum=0 이라는 출발점 변수를 만들어서 이 변수에 i=1 부터 n까지 더한 값을 넣는 것이 핵심이다. 그런데 여태까지 해왔던 것처럼 sysout을 for문 안에서 선언하니 '출력 초과'가 뜬다. 무한 루프일 경우 출력 초과가 뜬다. 여기에 대해 자세히 설명한 글을 아직 보지 못했지만... 추측컨대 += 연산자가 우항을 좌항에 계속 더하는 하나의 '과정'이 끝난 뒤 최종 결과가 출력돼야 할 것이다. 그런데 for문 안에서 출력을 선언하면 과정의 1단계, 2단계, n단계가 출력으로 계속 나와서 1개의 최종 결과가 아닌, '출력 초과'가 되는 것이다. 따라서 아래와 같이 for문 바깥에서 출력하면 정답으로 나온다.

문제 정답 나는 이 문제의 구조를 이해하지 못해서 틀렸다. 테스트 케이스를...입력받는 건가? 아니면 5번이라고 명시를 하는 건가? a+b 연산 자체는 구현하는 데 별 어려움이 없지만 갑자기 정처기에서나 볼 법한 테스트 케이스라는 게 등장해서 당황했다. 결론적으로, 테스트 케이스 횟수를 Scanner 클래스로 입력받는 것이 맞다. 그리고 이건 for문의 반복 횟수로 들어간다. (i

문제 정답 반복문 공부한지 좀 돼서 맞힐 수 있을까 조마조마했다 그래도 내 힘으로 풀려고 노력하니까 맞았다! 내가 생각한 알고리즘은 다음과 같다. - scanner 클래스로 입력 값 number 받기 - 입력 값에 곱할 1~9는 배열 gugu 미리 만들어두기 - 입력 값에 배열 값을 순서대로 곱한 변수 output 선언하기 - sysout으로 출력 형식에 맞게 출력하기 사실 알고리즘을 처음 생각할 때는 배열이 아닌, for문 안에서 곱하는 값을 1에서 9까지 차례로 증가시키려고 했다. 그런데 증가를 시키려고 하니 막상 어떻게 할지 약간 머리가 복잡쓰...^^;; 이렇게 푼 사람도 있을까? 구글링으로 다른 사람의 정답도 살펴봤다. 어떤 분은 for문에서 선언한 i 변수 자체를 이용해 곱하는 값을 1에서 9..

문제 정답 나는 처음에 당연히 내가 틀릴 줄 알았다. 비록 '틀렸습니다!!!'를 볼지언정, 한번 시도나 해보자는 마음으로 코드를 짰다. 그리고 '맞았습니다!'를 볼 수 있었다. 스스로 봤을 때 그다지 똑똑한 코드는 아니라고 생각한다. 그렇지만 논리적으로 결함이 없는 코드는 확실하다. 나처럼 수학적 사고가 아직 친숙하지 않은 비전공자들에게는 오히려 이 코드가 이해하기 쉽고 사용하기도 편할 것이다. 주사위의 세 수는 각각 a,b,c이며 분기는 3개로 나누어진다. ① 세 수가 같을 때 a==b==c를 하면 type mismatch 오류가 떠서 a==b && b==c 로 작성했다. ② 두 수가 같을 때 a==b 또는 b==c 또는 a==c가 있다. 각각의 경우에 맞게 if-else if-else 문을 써주었다...

문제 잘못된 코드 알람 시계 문제처럼 분 단위가 시 단위로 바뀌는 시점에서 출력을 다르게 해야 한다. ① 현재 시각의 분(min)+요리 시간의 분(time) < 60 hour는 그대로, min은 min+time이다. ② 현재 시각의 분(min)+요리 시간의 분(time) < 60 hour가 1씩 증가하는... 근데 120분 증가하면 2, 180분 증가하면 3 이런 식이다. 일단 hour++;로 써봤다. min 역시 복잡해졌다. 예를 들어 17시 40분에 60분이 더해지면 18시 40분이다. 이 때 출력값의 분은 40+60=100 / 100-60=40분이 된 것이므로 이를 수식으로 표현하면 min = (min+time)-time 이다. 혼자 코딩은 여기까지 할 수 있었다. 정답 시와 분 두 가지를 생각하느..

문제 정답 드디어 머리를 써야 하는 문제가 나왔다. 처음에는 '시간 차이'에 꽂혀서 time difference calcutation을 구글링했다. 덕분에 SimpleDateFormat 클래스와 Date.getTime(); 메소드를 발견했지만 이 두 클래스는 풀이와 아무 관련이 없다^^ 손으로 직접 쓰는 편이 이해하기 수월했다. 이 문제의 분기점은 크게 보면 2가지, 파고들면 3가지이다. ① min 45인 경우 hour는 그대로, min은 min-45가 된다. * 여기서 hour--;는 1씩 감소한다는 증감 연산자(in..

문제 정답 'n배수'를 어떻게 표현해야 할까? 구글링으로 힌트를 얻었다. n으로 나누었을 때 나머지가 0이면 된다. (1) 4의 배수이면서 100의 배수가 아닐 때 (2) 400의 배수일 때 를 처리해야 하므로 (1)은 &&(logical and) 연산자, (1)과 (2)는 || (logical or) 연산자로 처리하면 된다. 참고로, 같다는 표현은 = 연산자 같지 않다는 표현은 != 연산자를 사용한다.

문제 정답 && 연산자를 이용해서 n 이상 m 이하를 표현했다. 정답이어서 기분이 좋았지만 코드가 좀 길다는 생각이 들어서 다른 사람들은 어떻게 했나 검색해봤다. 그 결과, 입력 조건이 100 이하이기 때문에 if에서 score>=90 으로만 써도 됐었다. 또한 else if가 여러 개 쓰이는 조건문의 경우 위쪽 조건문에 만족되지 않을 때만 다음 조건문으로 내려오기 때문에 위쪽 조건문의 값보다 작다는 조건을 적지 않아도 되었다. 첫 번째 else if : 위쪽 if문의 값보다 작은 89점 이하가 자동으로 내려온다. 두 번째 else if : 위쪽 else if문의 값보다 작은 79점 이하가 자동으로 내려온다.