처음에는 시간초과가 났었던 문제이다.
알파벳을 기준으로 하지말고 기호를 기준으로 제어문을 나누었더니 시간초과문제가 해결되었다.
(처음에 풀었던 코드-python)
string = input()
length = len(string)
cnt = 0
idx = 0
while(idx != (length)):
if(string[idx] == 'l'):
if(string[idx+1] == 'j'):
cnt += 1
idx += 2
else:
cnt += 1
elif(string[idx] == 'n'):
if(string[idx+1] == 'j'):
cnt += 1
idx += 2
else:
cnt += 1
idx += 1
elif(string[idx] == 'd'):
if(string[idx+1] == 'z'):
cnt += 1
idx += 3
elif(string[idx+1] == '-'):
cnt += 1
idx += 2
else:
cnt += 1
idx += 1
elif(string[idx] == 'c'):
if(string[idx+1] == '-' or string[idx+1] == '='):
cnt += 1
idx += 2
else:
cnt += 1
idx += 1
elif(string[idx] == 's' or string[idx] == 'z'):
if(string[idx+1] == '='):
cnt += 1
idx += 2
else:
cnt += 1
idx += 1
else:
cnt += 1
idx += 1
print(cnt)
딱봐도 코드가 길고 가독성도 좋지 않은 코드이다. 시간문제는 덤이다. 좋지 않은 코드였다.
알파벳을 기준으로 제어문을 나누니 고려해야 할 사항이 많아졌다.
기호는 '-'와 '='밖에 없으니까 기호를 기준으로 제어문을 나눌 필요가 있었다.
(고친 코드는 아래와 같다-파이썬)
string = input()
cnt = len(string)
idx = 0
while(idx != len(string)):
if(string[idx] == '='):
if(string[idx-1] == 'c' or string[idx-1] == 's'):
cnt -= 1
elif(string[idx-1] == 'z'):
if(idx >= 2): # 인덱스 오류를 잡기 위해 꼭 필요
if(string[idx-2] == 'd'):
cnt -= 2
else:
cnt -= 1
else:
cnt -= 1
elif(string[idx] == '-'):
if(string[idx-1] == 'c' or string[idx-1] == 'd'):
cnt -= 1
elif(string[idx] == 'j'):
if(string[idx-1] == 'l' or string[idx-1] == 'n'):
cnt -= 1
idx += 1
print(cnt)
좀 더 코드가 간결해졌다.
이 때, 주목해야 할 부분은 9번째 줄이다.
if( idx>=2) 같은 제어를 안해준다면, index 범위 오류가 날 수 있는 위험이 있기 때문이다.
(처음부터 'z='로 시작하는 문자열이 있을 수 있기 때문에)
'dz='를 처리하는 것만 주의해준다면, 로직은 간단하다.
cnt를 문자열의 길이로 초기화하고
두 단어 이상의 문자가 크로아티아 알파벳이라고 여겨진다면, 한 단어로 인정해야 하므로, -1을 해주면 된다.
(이전에 자바로 풀었던 코드)
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
str=str.trim();
int count = 0;
for(int i =0; i< str.length();i++) {
char word = str.charAt(i);
count++;
if(word=='=') {
if(str.charAt(i-1)=='c') {
count--;
}
else if(str.charAt(i-1)=='s') {
count--;
}
else if(str.charAt(i-1)=='z') {
if(i>=2) {
if(str.charAt(i-2)=='d') {
count-=2;
}
else count--;
}
else count--;
}
}
else if(word=='-') {
if(str.charAt(i-1)=='c') {
count--;
}
else if (str.charAt(i-1)=='d'){
count--;
}
}
else if(word=='j') {
if(i!=0) {
if(str.charAt(i-1)=='l') count--;
else if(str.charAt(i-1)=='n') count--;
}
}
}
System.out.println(count);
sc.close();
}
}
로직은 파이썬과 자바가 동일하다.
반응형
'컴퓨터 공부 > 📚 Baekjoon(백준)' 카테고리의 다른 글
[백준/알고리즘/python/java] 1978번 - 소수 찾기 (0) | 2021.01.28 |
---|---|
[백준/알고리즘/python/java] 2839번 - 설탕 배달 (0) | 2021.01.28 |
[백준/알고리즘/python/java] 1316번 - 그룹 단어 체커 (0) | 2021.01.27 |
[백준/알고리즘/python/java] 4673번 - 셀프 넘버 (0) | 2021.01.27 |
[백준/알고리즘/python/java] 1065번 - 한수 (0) | 2021.01.26 |