코드스테이츠 백엔드 부트캠프 7일차 [java 기초-3]

wish17·2022년 12월 23일
0
post-thumbnail

Section 1 - [Java] 기초

제어문(Control Flow Statements) - 반복문

반복문

반복문은 코드들이 반복적으로 실행되도록 할 때 사용되며, 반복문의 종류로는 for문, while문, do-while문이 있다.

for문은 반복횟수를 알고 있을 때 주로 사용하고, while문은 조건에 따라 반복할 때 주로 사용한다.

for문

for (반복자 선언 및 초기화; 조건식; 증감식) {
실행될 코드
}

조건식을 충족하는 동안 초기화식부터 시작해서 증감식의 규칙을 따라서 실행한다.


향상된 for문 (Enhanced for 문)

  • 향상된 for문은 반복실행을 하기 위해 카운터 변수와 증감식을 사용하지 않는다.
  • 배열 및 컬렉션 항목의 개수만큼 반복하고 자동적으로 for문을 빠져나간다.
for (배열에서 꺼낸 항목을 저장할 변수 : 사용할 배열) {
실행 될 코드
}

배열에서 가져올 값이 있는지 확인 하고 만약 가져올 다음 항목이 없다면 자동적으로 종료


while문

  • while문은 조건식이 true일 경우에 계속해서 반복

  • for문과 while문은 초기화, 증감식의 위치만 다를 뿐 상호 대체가 가능

(초기화);
while(조건식) {
  실행될 코드; //조건식이 참인 동안 실행
  증감식;
}

조건식에는 boolean 변수나 true / false 값을 산출하는 어떠한 연산식이든 넣을 수 있다. (but true를 입력하면 무한루프)

무한루프 케이스에서 while문 내부에 if문, 혹은 break를 넣어 탈출 지점을 만들 수 있다.


do-while문

do {
  (1)실행문 //처음 한 번은 무조건 실행
} while((2)조건식);{
실행될 코드;
}

break문과 continue문

break문

  • for문, while문, do-while문, switch문을 실행 중지할 때 사용

  • break문은 대개 if문과 같이 사용

  • 반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료
    (바깥쪽 반복문에는 영향을 끼치지 않는다.)


continue문

  • for문, while문, do-while문에서만 사용

  • continue문이 실행되면 조건식으로 이동하여 작동


Quiz

수를 입력받아 홀수인지 여부를 리턴하라.

  • 반복문(while)문을 사용하라.
  • for문 사용은 금지
  • 나눗셈(/), 나머지(%) 연산자 사용은 금지
  • 0은 짝수로 간주

나의풀이

public class Solution { 
	public boolean isOdd(int num) {
		
    int i = 0;
    boolean sum =true;

    if(num<0) {
      num = -num;
    }

    while(i <= num) {
      sum = !sum;
      i++;
    }
    return sum;
	}
}

ans

public class Solution { 
	public boolean isOdd(int num) {
    if(num < 0) {
      num = -num;
    }

    while(num > 0) {
      if(num == 1) {
        //1에 도달한 경우 홀수이므로 true를 반환합니다.
        return true;
      }
      num = num - 2;
    }
    //반복문을 모두 순회할때까지 true를 반환하지 않는 경우 (num == 0일 경우) 짝수이므로 false를 반환
    return false;
	} 
}

9번
두 개의 수를 입력받아 두 수를 포함해 두 수 사이의 수 중 2의 배수의 개수를 리턴하라.

  • 반복문(for)문을 사용하라.
  • num1이 num2보다 작지 않을 수도 있다.
  • 0은 2의 배수가 아니라고 가정

나의풀이

public class Solution { 
	public int makeMultiplesOfDigit2(int num1, int num2) {
  int result = 0;
  int a1 = Math.max(num1,num2);
  int a2 = Math.min(num1,num2);
  
  for (int i=a2; i <= a1; i++){
    if(i%2 ==0){
    result++;
    }
  }
  
  if(a1==0 || a2==0){
      result = result -1;
  }
  return result;
	}
}

ans

public class Solution { 
	public int makeMultiplesOfDigit2(int num1, int num2) {
    int count = 0;
		int start = num1;
		int end = num2;

		if (num1 > num2) {
			start = num2;
			end = num1;
		}

		if (start == 0) {
			start = 1;
		}

		for (int i = start; i <= end; i++) {
			if (i % 2 == 0) {
				count += 1;
			}
		}

		return count;
	} 
}

12번

숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴하라.

  • 반복문(for)문을 사용하라.
  • str.split 사용은 금지
  • 빈 문자열을 입력받은 경우, 0을 리턴하라.

나의풀이

public class Solution { 
	public int getMaxNumberFromString(String str) {
  int a = str.length();
  int result = 0;
  
  for (int i=0; i<a; i++){
      if(result < (str.charAt(i)-'0')){
        result = str.charAt(i)-'0';
      }
  }
    return result;
	} 
}

str.charAt(i)은 문자(char)형으로 값이 나오기 때문에 int형(위 풀이에서는 result)과 연산하기 위해서는 0을 빼주고 계산하자.

ans

public class Solution { 
	public int getMaxNumberFromString(String str) {
    int maxNum = 0;
		int length = str.length();

		for (int i = 0; i < length; i++) {
			char character = str.charAt(i);
			int num = Character.getNumericValue(character);
			
			if (num > maxNum) {
				maxNum = num;
			}
		}

		return maxNum;
	} 
}

13번

문자열과 두 개의 문자(from, to)를 입력받아, 문자열에 등장하는 특정 문자(from)가 다른 문자(to)로 바뀐 문자열을 리턴하라.

  • 반복문(for)문을 사용하라.

나의 풀이

public class Solution { 
	public String replaceAll(String str, char from, char to) {
  int a = str.length();
  StringBuffer str1 = new StringBuffer(str);

  for (int i=0; i<a; i++){
      if(from == str.charAt(i)){
        str1 = str1.deleteCharAt(i);
        str1 = str1.insert(i,to);
      }
  }
  String str2 = str1.toString();
  return str2;
	} 
}

StringBuffer를 이용해 주어진 문자열 str으 특정 인덱스를 바꾸는 방식으로 풀었는데 답지는 새로운 문자열을 만들어 나가는 방식으로 풀었다.

ans

public class Solution { 
	public String replaceAll(String str, char from, char to) {
    String result = "";

		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == from) {
				result = result + to;
			} else {
				result = result + str.charAt(i);
			}
		}

		return result;
	} 
}

14

문자열을 입력받아 각 문자(letter) 뒤에 해당 문자의 인덱스가 추가된 문자열을 리턴하라.

  • 반복문(for)문을 사용하라.
  • 빈 문자열을 입력받은 경우, 빈 문자열을 리턴하라.

나의 풀이

public class Solution { 
	public String characterAndNumber(String word) {
  int a = word.length();
  StringBuffer word1 = new StringBuffer(word);

  for (int i=0; i<a; i++){
        word1 = word1.insert(i*2+1,i); // i*2+1번 인덱스에 i를 추가
  }
  String str2 = word1.toString();
  return str2;
	} 
}

13번과 마찬가지로 StringBuffer를 이용해 특정 인덱스에 값을 추가하는 방식으로 했다.

insert()를 사용해 특정 인덱스에 특정값을 추가하면 추가한 위치에 있던 값이 자동으로 +1 인덱스 위치로 밀려나는 것을 확인할 수 있었다.
ex) "wish" 문자열에 insert(1,5)해주면 "w5ish"가 된다.

ans

public class Solution { 
	public String characterAndNumber(String word) {
    String result = "";
		for (int i = 0; i < word.length(); i++) {
			result = result + word.charAt(i) + i;
		}
		return result;
	} 
}

18번 (오답!!)

2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴하라.

  • 이중 반복문(double for loop)을 사용하라.
  • 2-3-5-7의 형식으로 리턴하라.
public class Solution { 
	public String listPrimes(int num) {
  String result = "2";      

    for(int i=3; i<=num; i+=2) {
      boolean a = true; 
      for(int j=3; j<i; j+=2){
        if(i%j==0) {
        a = false;
        break; 
        }
      }
      if(a==true) {
        result = result+ "-" + i;
      }
    }    
    return result;
	} 
}

처음으로 못풀고 포기한 문제...
boolean타입을 이용할 생각을 못하고 이중포문 안에서 result = result+ "-" + i;를 넣어려고 계속 시도하다 if문이 너무 많아지고 얽혀서 손으로 다 써보고 수정하고 하다가.. 시간이 너무 많이 지나 결국 답지를 봐버렸다.

19

문자열을 입력받아 해당 문자열에 등장하는 각 문자(letter)를 가지고 만들 수 있는 길이 2의 문자열들을 리턴하라.

  • String 타입을 리턴해야 합니다.
  • 입력받은 문자열의 각 문자를 0, 1, 2, ..., n이라고 할 경우, 00,01,02,...,nn 형식으로 리턴해야 한다.
  • 이중 반복문(double for loop)을 사용해야 한다.
  • 빈 문자열을 입력받은 경우에는 빈 문자열을 리턴해야 한다.

나의 풀이

public class Solution { 
	public String makePermutations(String str) {
    String result="" ;
    

    for (int i=0; i<str.length(); i++) {
      for (int j=0; j<(str.length()); j++) {
        if(i==0&&j==0){ // 콤마로 return값을 시작하면 안되니 추가한거
          result= str.substring(0,1) +str.substring(0,1);
        }else{
          result= result+ "," + str.substring(i,i+1) +str.substring(j,j+1);
        }
      }
    }
    return result;
	} 
}

콤마,를 붙이는 위치를 나는 대입값 앞으로 지정했는데
풀이는 대입값 뒤로 지정해서 다른 형태가 되었다.

ans

public class Solution { 
	public String makePermutations(String str) {
    String result = "";

		if(str.isEmpty()) {
			return "";
		}
		for (int left = 0; left < str.length(); left++) {
			for (int right = 0; right < str.length(); right++) {
				result = result + str.charAt(left) + str.charAt(right) + ",";
			}
		}

		return result.substring(0, result.length() -1);
	} 
}

20번

문자열을 입력받아 해당 문자열에 중복된 문자(letter)가 존재하는지 여부를 리턴하라.

이 상태에서 한참 고민했다.
String 타입을 비교할 때는 equals 쓰자..

이상하게 for문 안에서 선언한 result는 for문 밖에서 사용할 수 없었다.
그래서 a를 추가했다.

나의 풀이

public class Solution { 
	public boolean hasRepeatedCharacter(String str) {
    boolean result=false;
    
    for (int i=0; i<str.length(); i++) {
      
      for (int j=0; j<(str.length()); j++) {
        if((str.substring(i,i+1)).equals(str.substring(j,j+1)) && i!=j){
          result = true;
          break;
        }
      }
      if(result==true) {
      break;
      }
      
    }
    return result;
	}
}

ans

public class Solution { 
	public boolean hasRepeatedCharacter(String str) {
    for (int i = 0; i < str.length() - 1; i++) {
			for (int j = i + 1; j < str.length(); j++) {
				if (str.charAt(i) == str.charAt(j)) {
					return true;
				}
			}
		}
		return false;
	} 
}

오늘의 정리

  • returnbreak를 포함한다.

  • str.substring(i,i+1)).equals(str.substring(j,j+1) 문자열str의 i번째 인덱스와 j번째 인덱스가 같은지 비교

  • str.length() 문자열 길이

  • str.insert(i,j), StringBuffer StringBuffer형 i번 인덱스에 j추가 (문자,문자열도 가능)

  • str1.deleteCharAt(i),StringBuffer StringBuffer형 i번 인덱스 삭제

  • String str2 = str1.toString(); StringBuffer형 str1을 String형으로 변경 (StringBuffer형은 String형과 다른 취급을 받는 듯 하다. )

  • str.charAt(i) str의 i번 인덱스값을 문자(char)로 출력

  • Math.max(num1,num2)더 큰 값 찾기

  • Math.min(num1,num2)더 작은 값 찾기

  • str.substring() 문자열 특정부분 잘라내기

0개의 댓글