SKSDUD
[일일코딩] 입력된 문자열에서 연속된 홀수 사이에 '-' 넣어 출력하기/조건문 if 본문
1️⃣ 문제
문자열을 입력받아 연속된 한자리 홀수 숫자 사이에 '-'를 추가한 문자열을 리턴합니다.
입력값 : String str
출력값 String
0은 짝수로 취급한다.
2️⃣ 수도코드
문자열 str을 배열로 만든다.
결과 str을 저장할 문자열 변수 선언
빈 문자열이면 null 반환
배열 요소에 모두 접근하면서
문자형 값을 정수형으로 바꾼다(홀/짝 계산 위함)
만약 i번째 값이 홀수이고 마지막 인덱스가 아니라면
만약 i+2번째 값이 홀수라면
값+'-'
값
결과값 반환
3️⃣ 필요한 문법
Char to Int : 문자를 숫자로 변환하기
- Character.getNumericValue();
- 문자 '0'을 빼기(ASCII 코드 사용)
char c='1';
//문자를 숫자로 바꾸기!
int result = c-'0'+123;
int result2=Character.getNumericValue(c);
System.out.printf("결과1: %d 결과2: %d",result,result2);
메서드를 사용하는 코드가 좀 더 깔끔한 거 같다.
if문의 로직에 관하여
난 왜 이 로직을 잘 이해를 못하겠지? 라고 생각만 하지 말고 한번 정리를 해보자 해서 해보는 정리.
개발자 마인드 장착을 위함
프로그램의 흐름(flow)을 바꾸는 역할을 하는 문장들을 제어문이라고 한다. 제어문에는 조건문과 반복문이 있다.
조건문은 조건에 따라 다른 문장이 수행되도록 하고
반복문은 조건에 따라 특정 문장들을 반복해서 수행한다.
- if문
if(조건식){
조건식이 참이면 수행할 문장
}
조건식에 해당하지 않으면 if문(블록)의 다음 문장을 수행한다. 조건식의 결과는 반드시 true 아니면 false이다.
- if - else문
if문 조건식의 결과가 참이 아닐 때 수행할 문장을 else 문에 적는다.
if(조건식){
조건식이 참이면 수행할 문장
} else{
조건식이 거짓이면 수행할 문장
}
두 개의 블록 중 어느 한 블록은 반드시 수행되게 된다.
- if - else if 문
if(조건식 1 ){
조건식이 참이면 수행할 문장
} else if(조건식 2 ){
조건식이 참이면 수행할 문장
}else if(조건식 3 ){
조건식이 참이면 수행할 문장
}else{
else 블록은 생략 가능. 위의 어느 조건식도 만족하지 않을 때 수행할 문장
}
첫 번째 조건식부터 순서대로 평가해서 결과가 참인 조건식을 만나면, 해당 블록{ }만 수행하고
if - else if 문 전체를 벗어난다! else 블록은 생략 가능한데 만약 위의 조건식에서 모두 거짓이고 else 문이 없다면 어떠한 블록도 수행되지 않을 수 있다.
- 중첩 if 문
if문의 블록 내에 또 다른 if문을 포함시키는 것이다. 중첩의 횟수는 상관없다.
if(조건식 1)
{
조건식 1의 연산결과가 참일 때 수행될 문장
if(조건식 2){
조건식 1과 조건식 2가 모두 참일때 수행할 문장
} else{
조건식 1이 참이고 조건식 2가 거짓일 때 수행할 문장
}
}
else
{
조건식 1이 거짓일 때 수행할 문장
}
블록이 복잡하지만 로직은 이렇다.
가독성이 좋지 않은 코드를 분석해 보면서 정리하자!
4️⃣ 코드
🟧 bad 코드
public String insertDash(String str) {
// TODO:짝수홀수 섞여서 들어옵니다 연속된 홀수 사이에 - 넣어서 리턴
//----------------------------------------------
//문자형 배열 선언, str을 배열로 만들기 .toCharArray()
char [] strArr=str.toCharArray();
//결과 str을 저장할 문자열 선언
String result="";
//빈 문자열이면 null return
if(str.length()==0) return null;
//배열에 모두 접근하면서(반복문)
for(int i = 0 ; i < strArr.length ; i++){
//문자형 값을 정수형으로 바꾸어서 홀수, 짝수 판별
int check=strArr[i]-'0';
//만약 i번째 인덱스 값이 홀수이고 마지막 인덱스가 아니라면
if(check%2 != 0 && i != (strArr.length-1)){
//i번째 인덱스가 마지막 인덱스가 아니고 i+1번 인덱스 값도 홀수라면
int check2 = strArr[i+1] - '0';
if(check2%2 != 0){//연속된 홀수인 경우
// 값 + '-'
result = result + strArr[i] + "-";
}
else{//연속된 홀수가 아닌경우
result=result+strArr[i];
}
}
else{// i번째 인덱스 값이 짝수라면
result=result+strArr[i];
}
}
//결과 리턴
return result;
}
결국, else if 나? else 냐? 에 따라 반드시 수행될 문장의 존재 여부에 따라 달린 문제인 거 같다.

🟩 good 코드
아주 쉽게 풀 수 있는 방법이 있었다...!
if(str.length()==0) return null;
String result = String.valueOf(str.charAt(0));
for(int i = 1; i < str.length(); i++){
// i번째 값이 홀수이고 i-1번째 값도 홀수라면(연속된 홀수)
if((Character.getNumericValue(str.charAt(i)) % 2 != 0) && (Character.getNumericValue(str.charAt(i-1)) % 2 != 0 ) ){
result = result + "-" + str.charAt(i);
}
else{
result = result + str.charAt(i);
}
return result;
문자열 문제가 나온다고 모두 배열로 바꿀 필요가 전혀 없다!
문자열에도 인덱스가 있기 때문에 charAt( ) 메서드를 이용해 배열처럼 접근 가능하다.
.charAt(i) / String.valueOf(문자)
문자열에서 i번째 값을 char형으로 리턴하는 charAt(i)
값을 저장할 땐 문자열이 편하기 때문에 String.valueOf( ) 메서드를 이용해 문자열로 변환해 준다!
i와 i-1에 대한 생각
마지막 인덱스를 생각해줘야 했던 bad 코드와는 달리 i와 i-1로 인덱스를 접근하면 코드가 간단해진다.
if 문은 연속된 두 홀수가 있는 경우
else 문은 그렇지 않은 경우
로 조건문도 매우 간단해졌다.
어떤 배열, 문자열의 그다음 값을 양의 개념으로만 생각하지 않고
음의 개념으로 접근한다면 코드가 간단해진다!
5️⃣ 느낀 점
- 인덱스에 대한 새로운 시각
- if문 정리하길 잘했다. 모르겠으면 뭐든지 다시 보자
- 수도코드를 먼저 쓰는 습관
- 메서드는 익숙해질 때까지!

'프로그래밍 > 일일코딩' 카테고리의 다른 글
[일일코딩] 배열을 입력받아 뒤집힌 배열을 리턴하기 (0) | 2023.01.31 |
---|---|
[일일코딩] 가장 긴 문자열과 짧은 문자열을 제거한 배열 리턴하기 (0) | 2023.01.31 |
[일일코딩] 문자열 내에 조건에 맞는 글자 있는지 여부 반환 (0) | 2023.01.27 |
[일일코딩] 2차원 배열을 입력받아 각 배열을 이용해 만든 HashMap 반환 (0) | 2023.01.24 |
[일일코딩] 각 단어의 첫 글자가 대문자인 문자열 반환 (4) | 2023.01.19 |