코딩테스트 17

[백준] 8958번 - OX퀴즈 (JAVA)

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다. 예를 들어, "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다. 다음 예시와 같이 OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 문제이다. 첫번째 줄에서는 총 몇 번의 퀴즈가 있었는지 숫자를 입력받는 것이므로, N변수에 받아 저장해둔다. 그리고 각 퀴즈에서의 점수를 받아 저장할 변수 score배열을 생성한다. 퀴즈의 갯수 N만큼 돌아가는 반복문을 가장 먼저 생성한 후, 입력받은 퀴즈결과는 X를 기준으로 토큰을 나누어준다. 이렇게 나누어진 총 토큰..

[백준] 4344번 - 평균은 넘겠지 (JAVA)

N개의 케이스에서 각각 평균을 넘는 학생의 비율을 계산하는 문제이다. 먼저 첫번째 줄에서 총 몇개의 케이스가 존재하는지 총 갯수 N을 입력받으며, 두번째 줄 부터는 첫 숫자는 해당 케이스의 학생 수가 주어진 후, 두번째 숫자부터는 각 학생들의 점수를 입력한다. 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다. 먼저 총 케이스의 갯수 N을 입력받아주고, 이 숫자만큼 돌아가는 반복문을 만들어준다. 한 줄 당 한개의 케이스이므로 StringTokenizer를 통해 각각의 토큰으로 받아준 후, 첫번째 숫자는 학생 수 이므로 별도의 number변수에 저장하고 나머지 숫자들은 number의 수만큼 돌아가는 반복문을 통해 score배열에 담아준다. 그리고 Arrays.st..

[백준] 1546번 - 평균 (JAVA)

실제 자신의 성적의 최댓값 M을 이용하여 모든 과목 점수에 점수/M*100을 계산하여 조작된 성적을 만드는 문제이다. 첫 줄에서 총 몇 과목이었는지 N이 주어지고, 둘째줄에서 각 과목의 실제성적이 주어지면 그 중 최댓값을 선별하여 조작된 성적값을 산출하면 된다. 그리고 이렇게 조작된 성적으로 새로운 과목평균점수를 산출하는 문제이다. 먼저 첫번째줄에서 과목의 갯수 N을 입력받아 저장한다. 이 때 Scanner를 사용해도 무관하지만, 처리시간 상 BufferedReader를 쓰는 것이 더 낫다. 두 번째 줄에서 입력받은 각 과목의 성적들은 띄어쓰기로 구분된 한 줄 짜리 데이터이므로, StringTokenizer를 이용해 공백을 기준으로 각 토큰으로 나누어 저장한다. 그리고 직전에 입력받아놓은 과목의 갯수 N..

[백준] 2562번 - 최댓값 (JAVA)

9개의 서로 다른 자연수가 주어졌을 때 그 중 최댓값을 찾고, 그 최댓값의 순서를 구하는 문제이다. 예를 들어, 서로 다른 9개의 자연수 [3, 29, 38, 12, 57, 74, 40, 85, 61] 이 주어지면, 이들 중 최댓값은 85이고 이 값은 8번째 수이다. 일단 BufferedReader나 Scanner를 통해 9개의 자연수를 입력받도록 한다. 입력받은 9개의 수를 담을 int형 배열 num을 생성하고, 숫자의 순서와 최댓값을 위한 변수 order와 max도 생성한다. 반복문을 통해 num배열 안에 9개의 수를 받아주고, 반복문 안의 조건문을 통해 최댓값과 순서를 찾아준다. 이 때 max값과 order값의 초기값은 0이며, 반복문 내에서 이전의 수와 비교했을 때 과거값

[백준] 2577번 - 숫자의 갯수 (JAVA)

세 개의 100~1,000 사이의 자연수를 입력받고 그 수들을 곱한 후, 결과값에 0~9까지 각각의 숫자가 몇 번씩 쓰였는지 알아내는 문제이다. 예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다. 먼저 0~9까지의 갯수를 각각 저장할 길이 10의 배열을 생성한다. 그리고 3개의 정수를 입력받아 곱한 후, 숫자의 개별적 비교를 위해 String.valueOf() 메소드를 이용하여 문자열 형식으로 변환한다. 문자열형식으로 변환된 결과값 str의 길이만큼 반복문을 수행하여 0번글자부터 charAt(인덱스)-'0' 함수를 이용하여..

[백준] 10818번 - 최소, 최대 (JAVA)

배열의 크기와 값을 각각 입력받은 다음, 해당 배열의 최솟값과 최댓값을 출력하는 문제이다. 임시 temp변수와 반복문을 사용하여 입력받은 배열값들의 최솟값과 최댓값을 구할 수도 있지만, 나는 배열을 정렬하는 Arrays.sort() 메소드를 이용하여 입력받은 값을 오름차순으로 정렬하여 첫값이 최솟값, 마지막값이 최댓값이 되도록 하였다. Today's Comment 다 풀고나서 제출버튼을 눌렀는데 채점이 너무오래걸려서 시간초과뜰까봐 당황했는데 정답처리로 뜨길래 신기했다! 다른 사람들에 비해 너무 오래걸렸을까봐 다른사람들 제출시간도 봤는데, 내가 그나마 빠르고 메모리도 적게쓴 편인 것 같아서 더 신기했던 경험... 별로 긴 코드도 아니고 아주 새로운 메소드같은걸 쓴것도 아니라서 왜 이 문제만 이렇게 메모리랑..

[백준] 1110번 - 더하기 사이클 (JAVA)

0~99 사이의 정수가 주어졌을 때 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙여 새로운 수를 만든다. 결과적으로 새로운 수가 가장 처음 입력받은 수와 동일해질때까지 해당 과정을 반복할 때, 몇 번을 반복해야 하는지를 구하는 문제이다. 예를 들어 26이라는 정수가 주어졌을 때 2+6 = 8이며, 새로운 수는 68이다. 68을 이용하여 계산하면 6+8 = 14이므로 새로운 수는 84이다 위와 같은 과정을 반복한다면 4번만에 원래 수로 돌아올 수 있기 때문에 26의 사이클의 길이는 4이다. 최초로 입력받은 수 n을 이용하여 새로운 수를 계속 만들어내야 하므로..

[백준] 10951번 - A+B (JAVA)

이 문제는 10952번 덧셈문제와 거의 동일하지만, 입력이 종료되었다는 의미로 특정 입력값을 설정하는 것이 아니라 값이 더이상 없을때까지 덧셈을 계속한다는 차이점이 있다. 처음에 문제를 읽었을 때는 그 바로 전 문제와 차이점이 뭐지 싶었는데, 값이 더이상 없을때까지 입력받는다는 것이 조건이라는 것을 몰라서 몇번을 틀렸었다... 그리고 NullPointerException을 계속 볼 수 있다... 이 문제에서 주의해야 할 것은 readLine()을 통해 입력받은 값은 String형이며, 값이 입력되지 않은 경우에는 null값이 들어온다는 점이다. 그렇기 때문에 while문 안의 조건에 readLine()을 통해 입력받은 값이 null인지 여부를 조건으로 설정하여, null이 아닌 경우에만 반복문이 수행되도..

[백준] 2884번 - 알람 시계 (JAVA)

24시간으로 표현되는 시간 값에서 45분을 앞당겼을 때의 시간을 구하는 문제이다. 시간은 "H M" 과 같이 두 숫자를 띄어쓰기로 구분된 한 줄로 입력받으며, 해당 숫자에서 45분을 앞당긴 숫자를 출력해야 한다. 만약 M이 45보다 크다면 H의 변동 없이 M-45계산만 적용한 후 시간을 출력하면 되지만, M이 45보다 작다면 H-1 계산을 하고 45분 더 앞당긴 값을 계산하여 M값을 출력해야 한다. M이 45보다 작은 경우 45-M을 하고 난 후 나머지 값을 60분에서 빼야 하므로, 위와 같이 나머지 값의 절댓값을 저장하는 gab변수를 설정하여 사용하였다. 그러나 만약 H가 0이라면 H-1계산을 하였을 때 -1시가 되므로, 이 경우에만 별도의 조건문을 통해 -1이 아닌 23이 출력되도록 처리해준다. 마지..

[프로그래머스] 1단계 - k번째 수 (JAVA)

여러 개의 숫자가 저장되어있는 배열에서 특정 위치의 값들만을 추출하여 오름차순으로 정렬한 후, 그 중 k번째 수를 추출하는 문제이다. 조건에서 사용되는 commands는 2차원배열이지만 배열 내부의 배열의 길이는 3으로 고정되어있기 때문에, 내부 배열을 위한 별도의 for문을 추가로 사용할 필요는 없다. 반복문을 사용해서 해결하는 문제이며, 배열을 정렬하는 Arrays.sort() 메소드와 배열 내부 특정 위치의 값들을 추출할 때 쓸 수 있는 Arrays.copyOfRange() 메소드를 사용하였다. ※ 정렬 메소드의 경우 Arrays.sort(배열) 의 형식으로 사용하면 자동으로 오름차순 정렬을 할 수 있다. 오름차순으로 정렬하면 숫자의 경우 작은 숫자~큰 숫자 순으로 정렬되고, 문자열의 경우 알파벳순..