목록JAVA (60)
먹었으면 뇌를 쓰자

문제 잘못된 코드 힘들었다... 전체 합, 배열 합, 빠진 수의 합, 전체 곱, 배열 곱, 빠진 수의 곱에서 규칙을 찾아서 로직을 짜보려고 노력했는데 잘 안됐다. 결국 방정식의 해까지 구해야 하는 문제가 생겼다. 점점 잘못되어감을 느끼고 그만뒀다. 정답 (*boolean) 로직은 다음과 같다. 1. boolean 데이터 타입 배열을 만든다. 0번부터 시작하므로 크기는 30+1=[31]이다. 2. 첫번째 for문 - 제출한 번호는 true로 배열에 저장한다. 3. 두번째 for문 - 제출하지 않은 번호는 자동으로 false가 되고, 이를 출력한다. 로직은 간단한데 수식 적는 게 좀 까다로워서 주석을 달아봤다. + 풀이 추가 BufferedWriter를 썼다.

문제 잘못된 코드(*런타임 에러 ArrayIndexOutOfBounds) 로직의 큰 줄기는 괜찮았지만 ... 1) int max = arr [0] 뒤에서 자세히 수정한다. 2) for문 조건절 인덱스를 0번째부터 찾으면 +1 처리를 해야 하니까 maxIndex를 아예 1부터 선언하고, for문 조건절도 int j=1로 해버렸다. 그러니까 if절에서 두 번째 값부터 돌리게 되는 불상사가 일어났다! 3) bw.write() 개행 처리 BufferedWriter는 개행 처리 안 된다 명심하자... 정답 2)와 3)은 무사히 수정을 완료했고, 1)의 경우 이전 문제였던 최대 최소처럼 int max = arr [0] 으로 처리하면? int maxIndex 에서 오류가 발생한다. 가령 {5,2,3,4}와 같은 배열..

문제 잘못된 코드 1) 배열을 먼저 만들고 2) for문으로 최댓값과 최솟값을 찾으려 했다 그런데 틀렸습니다... 정답 다른 분들의 알고리즘과 비교해봐도 틀린 부분이 없었다 그래서 혹시나 하는 마음에 print를 println으로 바꿨더니 성공함 (어이x) 결과가 한 줄에 출력되길래 나름 댁알이 쓴다고 print로 처리했는데 지금 와 생각해보니 띄어쓰기가 안되서 틀렸던 것 같다. 아침이라...댁알이가 살짝 젤리화됐나보다. + 풀이 추가 (* String.valueOf / Integer.toString ) BufferedReader와 BufferedWriter를 이용해 풀어보고 싶었다. BufferedWriter 때문에 마지막 형 변환이 중요한데 처음에는 형 변환을 아예 안해서 NullPointer 런타임..

문제 정답 어제 푼 첫 번째 문제를 복습하고 로직을 생각하면서 짰다 이 문제에서 중요한 부분은 '배열 값이 정수 a보다 작을 때' if문을 이용해 sysout으로 바로 출력하면 되는 간단한 로직이다. (+풀이 추가) BufferedReader + Scanner를 이용해봤다. 이 경우는 n과 x를 받고 나서 StringTokenizer를 한 번 더 실행해 다음 줄로 넘어가야 정답. 저 한 줄을 넣지 않으면 틀려버린다. BufferedReader + BufferedWriter를 이용해봤다. .flush()와 .close()를 깜빡하고 해주지 않았더니 틀렸습니다!!! 조심합시다.

문제 잘못된 코드(*런타임 에러) 배열은 생활코딩 반복문 하면서 아이스크림 겉핥기로 살짝 담가봤다. 제로베이스 상태이므로 구글링으로 코드를 조합해봤다. 런타임 에러가 뜬 걸 보니 for문에서 문제가 있는 것 같은데... 정답(*배열 주머니를 만들자) for문만 문제가 아니라 전반적으로 알고리즘이 틀려먹었다^^ 배열 문제이지만, 조건문과 반복문 로직이 중요한 것 같다. ★ 배열의 핵심은 배열 주머니를 만드는 것이다. (int [ ] numbers = new int [n]) ★ 이 문제처럼 입력 값으로 배열 주머니를 채운다면 for문을 써준다. (numbers [i] = sc.nextInt();) 4단계 배열도 앞으로 열심히 해보자. 익숙해지면 된다.

문제 잘못된 코드 내가 생각한 풀이과정은 다음과 같다. 1) 입력 값이 10 미만일 경우 01, 02 형식으로 바꿔야 한다. -> 구글링을 통해서 string.format() 메소드를 알아냈다. 앞에 0을 채워서 총 몇 자리로 나타낼지 정하면 된다. 이 문제는 2자리로 채워야하므로 "%02d"이다. 2) input 십의 자리 수+일의 자리 수 연산을 수행한 다음, 일의 자리 수+연산 결과 일의 자리 수를 "붙여야 한다." -> input/10, input%10로 십의 자리 수와 일의 자리 수를 분리했다. -> 그런데 입력 값이 10 미만인 변수 s는, 가령 01처럼 input/10을 하면 연산이 불가하다. -> 그리고 수를 "붙여야 하는" 개념을 어떻게 구현할지 모르겠다. 3) "붙여진" 수가 원래의 i..

문제 정답(*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문이 한 번 실행될 때마다 개행 처리를 해줘야 한다