[til_211125][java] java API 활용한 예제 - Math.random()과 .substring()

2021. 11. 25. 21:04JAVA

이번 주는 java API, 그 중에서도 string관련 메소드들을 활용하는 실습을 했다.

 

 

문제 1) 60, 70, 80, 100 의 숫자 중에서 임의의 숫자를 받아오는 메소드 만들기

 

 

사실 지난 시간 수업을 제대로 안 들어서 random메소드를 활용하는 방법을 잘 모른 상태에서 프린트물에 적혀있는 것만 보고 나름 머리를 굴린다고 굴리고 키보드 두들겨 봤는데:

int speed_limit() {
		while (true) {                 // while문 무한루프 문제 발생 !!
			int i = (int)Math.random()*100+1;
			if (i==60 || i==70 || i==80 || i==100) {
				return i;
			}
		}
	}

** 오답임.

아니 글쎄 프린트문으로 출력을 해봐도 아무것도 출력이 안 되는 것이다.

break; 가 없어 while문이 무한루프에 빠져있었다는 것..

return i; 하고 break;를 써주면 빨간 줄이 그어지는데 그게 왜 그런지는 아직 해결하지 못 했다. 

 

 

오늘 Math.random()메소드 제대로 활용하는 법을 강의 다시보기로 배웠다.

우선 

Math.random()은 0.0 이상 1 미만, 그러니까 0.0 ~ 0.99999...... 의 숫자를 반환한다.

1. 여기서 만약 5를 곱한 뒤 1을 더하고 정수형으로 강제 변환해주면 : (int)Math.random()*5+1 로,

1,2,3,4,5 중 하나의 난수 (임의의 수)를 반환해준다.

이렇게 수식으로 내가 원하는 수 중 난수를 받아오는 방법이 있는가 하면,

 

2. switch-case문을 활용하는 방법도 있다. 

위의 실습문제 중 1번 문제가 이 방법을 활용하는 방법이었다.

int speed_limit() {
		int i = (int)Math.random()*4+1;
		switch (i) {
		case 1 :
			return 60;
		case 2 :
			return 70;
		case 3 :
			return 80;
		case 4 :
			return 100;
		}
		return 0;  // 이걸 밖에다 써줘야 return값이 있다고 인식해서 빨간 줄 안생김.
	}

** 가능한 답안

그냥 몇 개 숫자 중 난수를 원하는지에 따라 switch case문을 활용하면 된다.

나는 60, 70, 80, 100 중 난수를 원하는 거니까

총 4 개 중 아무거나 반환받으면 된다.

따라서 1,2,3,4 중 난수를 받아오고, 각 숫자에 60, 70, 80, 100을 달아놓으면

60, 70, 80, 100 중 난수를 얻는 것과 마찬가지.

(사실 꼭 Math.random()*4에다가 1을 더해주지 않고 0,1,2,3으로 해도 된다.)

 

 


 

문제 2) 주어진 string 1 에서 주어진 string 2와 일치하는 부분이 몇 군데 있는지 받아오는 메소드 만들기

 

문제의 정확한 이해를 위해 Main:

String source = "The old man and the sea";
System.out.println(quiz.count(source,"he"))

(저 quiz 객체는 아래 나오는 count()메소드가 쓰인 클래스의 객체이다. 위에 생략된 부분에서 생성함.)

source 스트링에서 "he"라는 string이 몇 군데 있는지 받아오는 것이 목적이다.

출력: 2

 

이건 사실 아예 substring을 쓸 생각을 못해서 for문 끄적이다가 아예 완성을 못 시켰다.

 

int count(String st, String s) {
		int count = 0;
		for (int i=0; i<=st.length()-s.length();i++) {
			if (st.substring(i,i+s.length()).equals(s)) {
				count++;
			}
		}
		return count;
	}

** 가능한 답안

살짝 복잡해보이긴 하더라도 천천히 따져가면서 풀면 쉽다.

 

 

포인트는

mystr.substring(start,end)에서 end숫자는 불포함.

mystr.equals(str)으로 string끼리 비교. == 는 안됨! String은 자바 기본형이 아니라 레퍼런스이기 때문에 .equals("~") 메소드를 활용한다.

 


Math.random() 에서 원하는 숫자들로 구성하고 싶으면:

방법1) <수식>으로 구현  -- e.g. (int)Math.random()*100+1 => 1부터 100까지의 정수 중 난수.  주로 패턴이 있는 수들 중 난수를 구할 때 사용!

방법2) <switch-case문>으로 구현  -- 수식을 통해 임의의 수들로 구성하게 하고, 각 숫자를 case로 나누고 각각에 내가 원하는 임의의 숫자들 반환하도록. 이건 말보단 코드를 보면 이해가 쉬울 듯. 주로 패턴이 없는 임의의 수들 중 난수 구할 때 사용!

 

✔ mystr.substring(start,end)에서 end숫자는 불포함.

✔ mystr.equals(str)으로 string끼리 비교. == 는 안됨! String은 자바 기본형이 아니라 레퍼런스이기 때문에 .equals("~") 메소드를 활용한다.