목록전체보기 (101)
먹었으면 뇌를 쓰자

문제 정답(*EOF - End Of File) 앞선 문제에서 while문은 반복 횟수가 지정되지 않았을 때 쓴다고 정리했다. 그렇지만 입력을 종료하지 않으면 무한 루프로 런타임 에러가 날 것이다. 따라서 입력이 종료됐을 때 반복도 멈춘다는 의미로 EOF 처리를 해줘야 한다. Scanner와 BufferedReader는 서로 다른 EOF 처리를 할 수 있다. Scanner EOF는 나중에 필요할 때 검색해보고, 앞으로 쓸 BufferedReader EOF를 정리해봤다. 1) String 변수(여기서는 'input')를 선언한다 2) while 조건문에서 다음과 같이 정의한다 변수 input에 입력 값 br.readLine()을 담는다 !=null 처리하여 입력이 종료되어 값이 없을 때(null)까지 반복한..

문제 잘못된 코드(*출력 초과) 이번 문제는 테스트 케이스가 주어지지 않았다. 그래서 반복 횟수가 정해진 for문이 아닌, true/false로 반복하는 while문을 썼는데 출력 초과가 떴다. 무한 루프인가? 싶어서 더 찾아보니 break를 거는 방법이 있길래 추가했는데도 실패. 정답 while문을 쓰는 것도 break를 거는 것도 다 맞았는데 (신기) 묘하게 코드 순서 배치가 와르르맨션이었던 것 같다. 1) StringTokenizer 클래스는 while문 안쪽에서 선언해야 한다 (이전에 선언하면 런타임 에러) 줄 단위로 들어온 두 개의 입력 값을 쪼개는 전처리 자체도 반복되어야 해서 그런 것 같다. 2) 입력 값을 쪼개서 각각 변수 a,b로 선언하는 것도 반복되어야 하므로 마찬가지로 이전에 변수를 ..

문제 잘못된 코드(*런타임 에러) 두 가지 방법이 떠올랐다. 1) 쉬운 방법 --> 출력 값을 오른쪽 정렬 2) 어려운 방법 --> 테스트 개수 n - 별 개수(반복 횟수) = 공백 개수 설정 쉬운 길을 가고 싶어 출력 값을 오른쪽 정렬하는 법을 검색했다. printf 클래스를 사용하고, %c를 넣으면 문자열 오른쪽 정렬이 된다고 하더라. 뭔가... 잘못되었다. 역시 인생은 쉽게만 살아가면 재미 없는게 아니라 그냥 안 되나보다. 정답 자, 그렇다면 어려운 길을 가보자. "테스트 개수 n - 별 개수(반복 횟수) = 공백 개수 설정"도 결국 반복이 필요하다. 별 찍는 for문보다 앞쪽에 공백 찍는 for문을 만든다. 공백 찍는 for문은 "테스트 개수 n - 반복 횟수 i"가 될 때까지 실행되어야 한다. ..

문제 정답(*이중 for문) 문제의 관건은 for문으로 n번째만큼 반복할 때 출력 값도 n개씩 나오도록 횟수를 늘려주는 것이다. 검색을 통해 이중 for문을 사용하면 된다는 사실을 알았다! 이중 for문의 매커니즘은 다음과 같다. - 안긴 for문에서는 n의 횟수와 상관없이 * 하나만 출력된다 - 안은 for문에서는 n=1일 때 안긴 for문을 1번 실행, n=2일 때 안긴 for문을 2번 실행, n=3일 때 안긴 for문을 3번 실행 ... - 여기서는 BufferedWriter 클래스를 썼으므로 안은 for문이 한 번 실행될 때마다 개행 처리를 해줘야 한다

문제 정답 지난 문제에서 틀린 부분(StringTokenizer의 선언 위치)을 잘 정리했더니 이 문제는 한번에 맞힐 수 있었다. 두 가지 버전으로 풀어보았다. 하나는 BufferedReader(입력) + Scanner(출력)이다. 다른 하나는 BufferedReader(입력) + BufferedWriter(출력)이다. 크게 다르지는 않고, 성능 면에서 좋아지는 조합이다. BufferedWriter의 메소드는 .write(출력), .flush(해방), close(폐쇄) 세 개를 같이 써줘야 한다. 'Buffered-' 클래스는 데이터를 연산할 때 입력 즉시 하는 것이 아닌, 입력 값을 모아놨다가 한번에 연산하는 방식이기 때문이다. 이것은 마치...오픈 알바생이 아침에 가게 문을 열어 물류를 받으면 마감 ..

문제 잘못된 코드 (런타임 에러 NoSuchElement) 주석처럼 생각해서 코드를 짜봤는데 아예 틀린 코드는 아니지만 런타임 에러가 떴다. 어딘가에서 논리 구조가 이상한 건가? 정답 일단 위 코드에서 '4 출력'은 할 필요가 없었다. 출력을 잘못 봤다. String.valueOf도 쓸 필요가 없었다. BufferedReader를 통해 들어온 a와 b는 기본적으로 String 타입이기 때문이다. a와 b를 더하기 위해 Integer.parseInt를 사용한 것이므로 BufferedWriter로 출력할 때는 다시 String 타입으로 나온다. 정답의 관건은 StringTokenizer로 공백 단위를 구분해 입력 값을 받는 작업을 for문 안에서 수행하고 st.nextToken()이 아닌 br.readLin..

스프링은 JAVA/Kotlin 언어를 기반으로 편리한 개발을 돕는 프레임워크이다. 스프링은 한국 전자정부표준프레임워크이다. IDE(통합 개발 환경) 프로그램은 이클립스 기반 Spring Tools, IntelliJ 등이 있다. 내가 살짝 맛본 IDE는 인텔리J이다. 이클립스가 직관적이고 깔끔하다면, 인텔리J는 빠르고 성능이 좋다는 인상을 받았다. 스프링은 여러 특징이 있다. 그런데 이해하기가 꽤나 어렵다. 그래서 내가 이해할 수 있는 내용을, 이해할 수 있는 말로 정리해보았다. 스프링의 특징 ① AOP(관점 지향 프로그래밍) 애플리케이션에는 핵심 기능과 부가 기능이 있다. 예를 들어 성심당 웹 페이지에서 빵을 주문하는 앱을 만든다고 하자. 클래스 A(빵 주문) 핵심 기능 : 주문 부가 기능 : 로그 추적..

문제 막힌 코드 (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문 바깥에서 출력하면 정답으로 나온다.