230214 TIL #8 java 순서 섞기

김춘복·2023년 2월 14일
0

TIL : Today I Learned

목록 보기
8/571

230214 Today I Learned

조건문과 반복문, 배열을 공부했다. 내일이면 본격적으로 알고리즘 테스트에 들어간다.
오늘은 조건문 반복문 문제 풀면서 헷갈린 것들을 정리하겠다.

순서섞기

  • 배열의 순서를 섞는 방법
String[] words = { "television", "computer", "mouse", "phone"}
for (int i = 0; i < words.length; i++) {
	char[] question = words[i].toCharArray(); // String을 char[]로 변환
    
    // char배열 question의 글자 순서를 섞는다.
    for (int j= 0; j<question.length; j++){
        int k = (int) (Math.random() * question.length);
        char tmp = '0';

        tmp = question[0];
        question[0] = question[k];
        question[k] = tmp;
    }
    System.out.printf("Q%d. %s의 정답을 입력하세요 .>", i + 1, new String(question));
  • 순서섞기에 변수가 은근히 헷갈린다. 따로 정리하지 않으면 다시 만날때 또 헷갈릴 것 같다.

  • 일단 순서 섞을 때 필요한 랜덤 정수
    : int k = (int) (Math.random() * 배열.length);

  • 임시 변수 tmp를 세워놓고

  1. tmp에 배열의 첫 값을 넣기.
  2. 배열의 첫 값에 랜덤인덱스의 배열 값을 넣기.
  3. 랜덤인덱스의 배열 값에 1번의 tmp값 넣기

결과적으로 첫값과 랜덤인덱스값이 바뀐다.

이걸 배열 길이만큼 반복문으로 묶어주면 배열이 뒤죽박죽으로 섞인다!!

  • 그리고 해당 예시는 1) String 문자열을 char 배열로 저장한 다음 섞고 다시2. char 문자열을 String문자열로 돌리는 과정이다.

1) char[] 문자배열변수명 = 문자열변수.toCharArray();

2) String 새로운문자열변수명 = new String(문자배열변수명);


양수 음수 번갈아 합

  • 문제
//4-4. 1+(-2)+3+(-4)+...과 같은 식으로 계속 더해나갔을 때, 
//몇까지 더해야 총합이 100 이상이 되는지 구하세요.
class Exercise4_4 {
    public static void main(String[] args) {
        int sum = 0; // 총합을 저장할 변수
        int s = 1; // 값의 부호를 바꿔주는데 사용할 변수 
        int num = 0;
        /*빈 칸*/
        System.out.println("num="+num);
        System.out.println("sum="+sum);
    } 
}
  • 시도 :
    for (num = 1; sum<=100; num++;)로 시도했다가 실패
    계속 for로 시도했다가 디버그 모드로 큰 문제점 발견
    num이 음수가 되면 num++이 절대값을 못 늘려주고 계속 -1 0 1 여기서 순환하는걸 깨닳음
    그래서 for문의 num++은 쓰면 안되겠다 싶어서
    while문 으로 시도.
    했지만 1시간 가량 막혀서 다른 문제 풀다가 도전.
  • 해결:
        int sum = 0; // 총합을 저장할 변수
        int s = 1; // 값의 부호를 바꿔주는데 사용할 변수
        int num = 0;

        while (sum<100) {
            num = Math.abs(num) + 1;
            num = num * s;
            s = -s;
            sum += num;

        }
        System.out.println(num);
        System.out.println(sum);

while문을 써서 반복문이 돌 때 마다 num을 절대값에 1추가되는 값을 계속 넣고
s = -s로 음수를 지정해주고 sum += num으로 sum값 세팅하니
num = 199, sum 100으로 해결!

  • 알게된 점:
    반복문을 for문만 계속 쓰다보면 이런 문제가 발생한다.
    while도 염두해두고 문제를 풀자!

자리수의 합

  • 문제
    num = 12345, 각 자리수를 합하여 1+2+3+4+5를 도출해라.
int num = 12345;
		int sum = 0;
		/*
		(1) 알맞은 코드를 넣어 완성하시오.
		 */
		System.out.println("sum="+sum); // 결과 : sum=15
  • 시도
            int num = 12345;
           int sum = 0;
           int i = 0;
           while (Math.pow(10,i) < num){
               ++i;
               int n = (int) (num % Math.pow(10,i));
               int m = (int) (num % Math.pow(10,i-1));
               int k = (n - m)/ (int)Math.pow(10,i-1);
               sum += k;

java에서 제곱을 표현할때 쓰는 함수인 Math.pow(밑,지수)를 써서
10의 제곱으로 나눈 나머지 값을 계속 더해가며 풀었는데
이것도 정답은 맞지만
다른 답을보니 충격적으로 깔끔해서 메모해 둔다.


* 해결
```java
while(num > 0) {
	sum += num%10;
	num /= 10;
}

접근법은 나랑 비슷하지만 3줄만에 완전 깔끔하게 풀었다.
num%10을 쓰고, num자체를 num /= 10으로 다시 배정해서

소수점 아래는 어차피 버려지니 이렇게 푸는 방법이었다.

  • 알게된점 : 같은 접근법이라도 훨씬 깔끔하게 푸는 방법이 있을테니 계속 고민해보면서 풀자.

기타

  • 자바에서 제곱을 표현하려면 Math.pow(밑, 지수)

  • 10의 5승은 Math.pow(10,5)

  • String, 문자열은 맞는지 여부 판단할 때 ==대신 .equals("")!!

profile
Backend Dev / Data Engineer

0개의 댓글