728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/60057
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import java.io.IOException;
class Solution {
public int solution(String s) {
int answer = Integer.MAX_VALUE;
if(s.length()==1){
return 1;
}
for(int i=1;i<=s.length()/2;i++){
String prev=s.substring(0,i);
String comp="";
int count=1;
for(int j=i;j<=s.length();j+=i){
if(j+i>s.length()){
comp+=s.substring(j);
continue;
}
if(prev.equals(s.substring(j,j+i))){
count++;
}else{
if(count>1){
comp+=Integer.toString(count)+prev;
}else{
comp+=prev;
}
prev=s.substring(j,j+i);
count=1;
}
}
//남은 애들
if(count>1){
comp+=Integer.toString(count)+prev;
}else{
comp+=prev;
}
answer=Math.min(answer,comp.length());
}
return answer;
}
}
|
cs |
java에서는 문자열을 자를 때 substring함수를 이용한다.
다만 이 문제를 풀면서 중요한것은 이중 for문에서 문자열 길이만큼 for문을 돌리지만
if(j+i>s.length()){
comp+=s.substring(j);
continue;
}
만약 j+i가 s.length()보다 커지면 더이상 substring을 할 수 없기에 따로 처리를 해줘야한다. 그래서 j부터 마지막까지만 잘라주면 된다.
만약 splice에서 남는게 생겼을 때 예외처리를 더 꼼꼼하게 해본 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
import java.io.IOException;
class Solution {
public int solution(String s) {
int answer = Integer.MAX_VALUE;
if(s.length()==1){
return 1;
}
for(int i=1;i<=s.length()/2;i++){
String prev=s.substring(0,i);
String comp="";
boolean odd=false;
int count=1;
for(int j=i;j<=s.length();j+=i){
if(j+i>s.length()){
if(j<s.length()){
odd=true;
if(count>1){
comp+=Integer.toString(count)+prev;
}else{
comp+=prev;//이전것을 담아주기
}
}
comp+=s.substring(j);
break;
}
if(prev.equals(s.substring(j,j+i))){
count++;
}else{
if(count>1){
comp+=Integer.toString(count)+prev;
}else{
comp+=prev;
}
prev=s.substring(j,j+i);
count=1;
}
}
//남은 애들
if(!odd){
if(count>1){
comp+=Integer.toString(count)+prev;
}else{
comp+=prev;//이전것을 담아주기
}
}
answer=Math.min(answer,comp.length());
}
return answer;
}
}
|
cs |
aabbaccc가 있을 때 이걸 3개씩 자르면
aab/bac/cc로 잘리게 되는데 그러면 뒤에 cc가 남게 된다.
if(j+i>s.length()){
comp+=s.substring(j);
continue;
}
이 코드를 만났을 때 j가 6일때 조건문에 걸리게 된다. 근데 이때 comp+=s.substring(j)를 하게 되면
comp가 사실상 aabccbac가 된다. 그니까 저 조건문을 만나면서 가장 끝에 잘려야하는 cc가 중간으로 와버리게 되는 것이다..! 그래서 남는게 생기면 먼저 잘라주고 남는애들을 뒤에 붙여주는걸 한번에 몰아서 써줬다.
88점 맞았던 처음 쓴 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
import java.util.*;
class Solution {
public int solution(String s) {
int len=s.length();
int splitLen=1;
int minLen=Integer.MAX_VALUE;
if(len==1){
return 1;
}
while(splitLen<=len/2){
String ss="";
ArrayList<String>stringList=new ArrayList<String>();
ArrayList<Integer>intList=new ArrayList<Integer>();
int i=0;
int latestIdx=0;
while(i+splitLen<=len){
String target="";
latestIdx=stringList.size()-1;
target=s.substring(i,i+splitLen);
if(latestIdx>=0&&stringList.get(latestIdx).equals(target)){
int num=stringList.indexOf(target);
int cnt=intList.get(num);
cnt+=1;
intList.set(num,cnt);
}else{
stringList.add(target);
int num=stringList.indexOf(target);
intList.add(1);
}
i+=splitLen;
}
//마지막 애들 담아주기
String target=s.substring(i);
if(latestIdx>=0&&stringList.get(latestIdx).equals(target)){
int num=stringList.indexOf(target);
int cnt=intList.get(num);
cnt+=1;
intList.set(num,cnt);
}else{
stringList.add(target);
int num=stringList.indexOf(target);
intList.add(1);
}
for(int j=0;j<stringList.size();j++){
if(intList.get(j)>1){
ss+=Integer.toString(intList.get(j))+stringList.get(j);
}else{
ss+=stringList.get(j);
}
}
if(ss.length()<minLen){
minLen=ss.length();
}
splitLen+=1;
}
return minLen;
}
}
|
cs |
728x90
반응형
'알고리즘 > 완전탐색' 카테고리의 다른 글
[java 백준] 골드 4 / 7573번 고기잡이 (0) | 2023.03.03 |
---|---|
[java 백준] 골드 5/ 15686번 치킨배달 (0) | 2022.07.25 |
[java 백준] 골드 4/ 1806번 부분합 (0) | 2022.04.02 |
[java 백준] 실버 3/ 2003번 수들의 합 2 (0) | 2022.03.31 |
[java 백준] 골드 4/2580번 스도쿠 (0) | 2022.03.28 |
댓글