


우선 내가 초반에 작성한 코드는 아래와 같다.
class Solution {
public int[] solution(int n, String[] words) {
int[] answer = {0, 0};
label:
for (int i = 0; i < words.length; i++) {
char lastChar = words[i].charAt(words[i].length() - 1;
char firstChar = words[i + 1].charAt(0);
for (int j = i + 1; j < words.length; j++) {
// 앞사람이 말한 단어를 또 말하는 경우
if (words[i].equals(words[j])) {
answer[0] = j % n + 1;
answer[1] = j / n + 1;
break label;
}
// 앞사람이 말한 단어의 마지막 문자로 시작하지 않는 경우
if (lastChar != firstChar) {
answer[0] = (i + 1) % n + 1;
answer[1] = (i + 1) / n + 1;
break label;
}
}
}
return answer;
}
}
문제없이 잘 작성했다고 생각했는데 테스트 19에서 계속 에러가 났다.
내 코드에 틀린 점이 없다고 생각해서 오랫동안 붙들고 있었는데
틀린 게 아주 많은 코드였던 것 같다 ㅎㅎ
1. 기존 코드의 문제점
(물론 혼자 생각한 것이라 이외에도 문제점이 많을지도 모른다!)
(1) 인덱스 범위 이탈(?)
위의 코드 6행의 for문을 보면 i는 0 ~ words.length - 1까지인데,
8행을 보면 words의 (i + 1) 인덱스를 이용한다.
그럼 마지막에는 words.length 인덱스를 이용한다는 것인데 이건 인덱스 범위를 이탈한다.
이 문제때문에 에러가 뜬 건 아니지만(왜 안 떳는지는 모르겠다.)
중요한 점을 신경쓰지 않고 있었다.
(2) 불필요하게 for문 내에 들어있는 코드들
17~21행의 '앞사람이 말한 단어의 마지막 문자로 시작하지 않는 경우' 를 보면,
여기는 j을 사용하지 않는데도 for문 안에 들어가 있다.
그러면 똑같은 코드를 불필요하게 여러번 사용하게 되면서 성능이 낮아질 것이다.
(3) 로직의 문제
테스트 19에서 계속 에러가 난 이유는 당연히 로직의 문제이다.
아래 사진은 i = 0일 때 두 문자열을 비교하는 순서(?)를 나타낸건데,
dog - bad 사이에 단어 연결이 안되기에 bad일 때의 번호와 차례를 answer에 담아야 하는데
그렇지 못하게 된다.
단어 연결이 안되는 경우와 똑같은 단어를 또 말하는 경우를 따로, 또 동시에 생각했어야 했는데
머리가 잘 안돌아갔던 것 같다.

수정된 코드는 아래와 같다.
class Solution {
public int[] solution(int n, String[] words) {
// 문제가 없을 경우에는 {0, 0}을 반환할 수 있도록 {0, 0}로 answer를 초기화했다.
int[] answer = {0, 0};
label:
for (int i = 1; i < words.length; i++) {
// 앞사람이 말한 단어의 마지막 문자로 시작하지 않는 경우
char lastChar = words[i - 1].charAt(words[i - 1].length() - 1);
char firstChar = words[i].charAt(0);
if (firstChar != lastChar) {
answer[0] = i % n + 1;
answer[1] = i / n + 1;
break label;
}
// 앞사람이 말한 단어를 또 말하는 경우
for (int j = 0; j < i; j++) {
if ((words[i].equals(words[j]))) {
answer[0] = i % n + 1;
answer[1] = i / n + 1;
break label;
}
}
}
return answer;
}
}
2. 수정된 지점들
(1) 인덱스 범위
인덱스 범위를 초과하는 문제를 해결하고자 i을 수정해주었다.
i를 1부터 시작하는 것으로 바꾸고 필요에 따라 i - 1을 이용해주었다.
(2) for문 내의 코드 정리
j을 이용하지 않는 '앞사람이 말한 단어의 마지막 문자로 시작하지 않는 경우'는
이중 for문 내에 넣지 않고 바깥으로 빼주어서 불필요한 실행을 하지 않도록 했다.
(3) 로직 수정
위의 1-(3)에서의 사진과 같이 하면 answer에 의도치 않은 값이 들어가기에 생각을 다시 해봤다.
아래 사진과 같이 비교를 해야지 의도한대로 값이 들어간다.

큰 틀에서 봤을 때 코드에 큰 변화는 없는데,
for문의 i, j의 초기값과 조건을 바꾸어서 위의 사진처럼 비교할 수 있게 하였다.
i를 기준으로 두고 j을 이용해서 words[i]의 문자열이 이전에 나온적 있는지 체크한다.

'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] #134240 푸드 파이트 대회 (0) | 2024.08.24 |
---|---|
프로그래머스 #42586 기능개발 (0) | 2024.08.19 |
프로그래머스 #12906 같은 숫자는 싫어 (0) | 2024.08.17 |
프로그래머스 #12948 핸드폰 번호 가리기 (0) | 2024.08.12 |
프로그래머스 #12916 문자열 내 p와 y의 개수 (0) | 2024.08.02 |