어제 포스팅한 대로 오늘은 정답률 높은 순으로 세 문제를 더 풀게 되었다. 내일부터는 교재로 공부할 예정이다.
개인 기록 및 정리용 블로그이므로, 기록이 유의미해지려면 포스팅 과정에서 교재의 해설 내용이 부분 삽입되어야 한다. 교재는 영리 목적으로 제작된 것이기에 당분간은 불가피하게 코딩테스트 관련 포스팅을 쉬게 되었다. 다른 글은 계속 올릴 예정이다.
대문자와 소문자
이 문제는 푸는 데 좀 고생했다. 알파벳의 아스키 코드를 모르기 때문이다.
알파벳이 26개니까 대문자와 소문자의 아스키 코드가 26 차이가 날 거라고 생각했다. 대문자가 먼저인지 소문자가 먼저인지 몰라 일단 소문자가 먼저인 것으로 가정하고 계산해 봤다.
그런데 array 배열을 String 타입으로 선언했다. charAt 메소드의 결과들을 입력할 것이므로 char 타입으로 선언해야 한다.
결과값이 아주 이상하게 나온다. 반대로 했구나 싶어 대문자와 소문자의 연산을 서로 바꿨다.
여전히 결과값이 제대로 나오지 않는다. 검색해 보니 중간에 다른 문자들이 있어 대문자와 소문자는 32 차이가 난다.
일단 차이는 맞다. 그런데 대문자가 안 나오고 전부 소문자만 나온다.
소문자와 대문자를 서로 다른 반복문으로 돌렸기 때문에, 위의 forj문을 통해 소문자에서 대문자로 바꿔 둔 걸 아래의 forj문에서 다시 소문자로 바꿔 버리는 것이다. 앞으로 반복문을 작성하면서 반드시 주의해야 할 부분이다.
같은 반복문 안에서 else if 문을 이용해 서로 배타적인 연산을 하도록 만들었다. 이 방식이 코드도 더 간결하다.
아스키 코드를 직접 대입해 풀었다. 문자의 아스키 코드는 기본적인 것인데 외워 두지 않아서 발생한 일이다. A는 65부터 시작하고 대문자와 소문자는 32 차이가 난다. 외워 둬야겠다.
가위 바위 보
쉬운 문제다. 역시 charAt 메소드를 이용하면 될 것 같다.
for 반복문을 이용해, 추출한 값이 '2'이면 '0', '0'이면 '5', '5'이면 '2'를 answer 변수에 더하도록 했다.
문자열 정렬하기 (1)
문자열에서 숫자를 추출해 오름차순으로 정렬하는 문제다. 정답률에 비해 나에게는 조금 복잡한 과정이었다. 확실히 문자열 쪽이 약한 것 같다.
아까 익힌 알파벳의 아스키 코드를 바로 써먹어 볼 수 있게 되었다. 풀다 보니 숫자의 아스키 코드도 암기해 두면 좋을 것 같다는 생각이 들었다. 숫자는 48부터 시작한다.
1. charAt 메소드를 이용해 숫자만 추출한 뒤, String 변수 numbers에 저장한다. String 변수를 사용한 이유는 주어진 my_string 변수에 따라 추출될 숫자의 수가 모두 다르기 때문이다. 배열은 길이를 변경할 수 없다.
2. 길이가 결정되었으므로 answer 배열 변수에 옮긴다. 역시 charAt을 사용했는데, int형에 옮기는 데도 강제 타입 변환을 해 준 이유는 혹시 이렇게 하면 아스키 코드가 아닌 숫자 자체가 옮겨질 수도 있지 않을까? 하는 생각에서였다. 숫자의 아스키 코드를 미리 알고 있었다면 이런 짓을 할 필요가 없었을 것이다.
3. 이중 반복분을 통해 순서를 바꿔 작은 순서대로 정렬한다. 예전에 어렵게 풀었던 문제에서 했던 것과 비슷한 방식이다.
하지만 결과는 처참했다. 7, 8번째 줄에서는 charAt 메소드의 괄호를 대괄호로 쓰고, 20번째 줄에서는 answer 배열의 대괄호를 괄호로 썼다. 집중력이 많이 떨어졌을 때 풀었나 보다. 배열과 메소드를 여기저기 오가면서 뒤죽박죽으로 만들다 보니 이렇게 된 모양이다.
이번에는 ArrayIndexOutOfBoundsException이 발생했다. answer 배열 변수의 길이를 numbers 문자열 변수의 길이가 0일 때의 길이로 설정해 둬서 그렇다. answer 변수의 선언은 뒤에 나왔어야 했다.
answer 변수의 선언을 뒤로 옮겨 예외는 사라졌지만, 역시나 아스키 코드가 산출된다. 강제 타입 변환 같은 걸로 될 리가 없다. 그냥 어제 다른 풀이에서 본 substring 메소드를 이용하기로 했다.
이렇게 해도 답이 제대로 나오지 않는다. 2에서 더 새로운 수를 가져오지 못하고 계속 반복되는 것 같다.
원인은 20번째 줄에서 answer[j]에 answer[j + 1]을 대입한 후에 21번째 줄에서 answer[j + 1]에 answer[j]를 대입한 것에 있었다. 이렇게 되면 answer[j + 1]에는 원래 값만 남게 된다. 너무 기초적인 실수를 한 것이다.
int 타입 변수 x를 새로 선언해 옮기는 작업을 보조했다. 더 깔끔한 방법이 있을 텐데 떠오르지 않는다...
정규 표현식을 이용해 한 줄로 풀었다. 짧은 풀이가 몹시 부럽다.
'Coding Test' 카테고리의 다른 글
Java 코딩테스트 연습 13일차 (프로그래머스 스쿨 Lv.0, 1183점) (0) | 2023.03.19 |
---|---|
Java 코딩테스트 연습 12일차 (프로그래머스 스쿨 Lv.0, 1176점) (0) | 2023.03.18 |
Java 코딩테스트 연습 11일차 (프로그래머스 스쿨 Lv.0, 1146점) (0) | 2023.03.17 |
Java 코딩테스트 연습 10일차 (프로그래머스 스쿨 Lv.0, 1130점) (0) | 2023.03.16 |
Java 코딩테스트 연습 9일차 (프로그래머스 스쿨 Lv.0, 1100점) (0) | 2023.03.15 |