[Java] Solution to puzzles

Joy🌱·2022년 12월 27일
0

🧩 Coding Challenges

목록 보기
5/20
post-thumbnail

🧩 정수형 배열을 선언 및 할당한 뒤, 인덱스에 값 넣어 출력하기

💁‍ 길이가 10인 정수형 배열을 선언 및 할당한 뒤, 각 인덱스에 차례대로 1부터 10까지 값을 넣고 출력하세요.

package com.greedy.section01.array.level01.basic;

public class Application1 {

	public static void main(String[] args) {
		
		// 길이가 10인 정수형 배열을 선언 및 할당
		int[] iarr = new int[10];
		
		// 각 인덱스에 차례대로 1부터 10까지 값 부여
		for(int i = 0; i < iarr.length; i++)
			iarr[i] = i+1;
		
		// 출력
		for(int i : iarr) {
			System.out.print(i + " ");
		}
	}
}

💬 Overall Comment

* 아직 배열에 값을 부여하고 출력하는 for문을 헷갈려하지만 배열에서는 보다 더 간결한 향상된 for문을 
  사용하기 때문에 터득하기 좋을 것 같다고 생각한다. 공부하자!

🧩 문자열 배열을 선언 및 초기화한 뒤, 정수를 입력받아 해당 인덱스의 과일 출력하기

💁‍ 길이가 5인 String 배열을 선언하고 "딸기", "바나나", "복숭아", "키위", "사과" 로 초기화한 뒤, 스캐너로 0부터 4까지의 정수를 입력 받아 해당 정수의 인덱스에 있는 과일을 출력하세요.
단, 배열의 인덱스 범위를 벗어나는 경우 "준비된 과일이 없습니다." 를 출력하세요.

🚩 Example Input & Output

0부터 4까지의 정수를 입력하세요 : 2
0부터 4까지의 정수를 입력하세요 : 5
복숭아
준비된 과일이 없습니다.
package com.greedy.section01.array.level01.basic;

import java.util.Scanner;

public class Application2 {

	public static void main(String[] args) {
		
		String[] fruit = {"딸기", "바나나", "복숭아", "키위", "사과"};
		
		Scanner sc = new Scanner(System.in);
		System.out.print("0부터 4까지의 정수를 입력하세요 : ");
		int number = sc.nextInt();
		
		if(!(number < 5 && number > -1)) {
			System.out.println("준비된 과일이 없습니다.");
		} else {
			for(int i = 0; i < 1; i++) {
				System.out.print(fruit[number]);
                >>> fruit 배열의 number째 자리의 값 출력
			} 
		}
	}
}

🧩 문자를 하나 입력 받아 입력 받은 문자가 문자열에 몇개 있는지 출력하기

💁‍ 문자열을 하나 입력받아 문자 자료형 배열로 바꾼 뒤, 문자를 하나 입력 받아 입력 받은 문자가 문자열에 몇개 있는지를 출력하세요.

String Class의 toCharArray() : char[] 메소드 활용 가능

char[] carr = 문자열변수.toCharArray();

🚩 Example Input & Output

문자열을 하나 입력하세요 : helloworld 
검색할 문자를 입력하세요 : l
입력하신 문자열 helloworld에서 찾으시는 문자 l은 3개 입니다.
package com.greedy.section01.array.level02.normal;

import java.util.Scanner;

public class Application1 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("문자열을 하나 입력하세요 : ");
		String str = sc.nextLine();
		char[] strCh = str.toCharArray();
		System.out.print("검색할 문자를 입력하세요 : ");
		char letter = sc.nextLine().charAt(0);
		
		int count = 0;
		
		for(int i = 0; i < strCh.length; i++) {
			if(letter == strCh[i]) {
				count++;
			}
		}
		System.out.println("입력하신 문자열 " + str + "에서 찾으시는 문자 " + letter + "은 " + count + "개 입니다.");
	}
}

📌 Ref.

* toCharArray()는 문자열을 한 글자씩 쪼개서 이를 char타입의 배열에 집어넣어주는 메소드

💬 Overall Comment

* strCh의 타입이 Char이므로 letter변수도 String이 아닌 char로 맞춘 뒤, charAt(0)을 사용했어야했다. 

🧩 주민등록번호를 입력받아 성별 자리 이후부터 *로 가리고 출력하기

💁‍ 주민등록번호를 스캐너로 입력 받고 문자 배열로 저장한 뒤, 성별 자리 이후부터 '*'로 가려서 출력하세요.

🚩 Example Input & Output

주민등록번호를 입력하세요 : 990101-1234567
990101-1******
package com.greedy.section01.array.level02.normal;

import java.util.Scanner;

public class Application2 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		System.out.print("주민등록번호를 입력하세요 : ");
		String idNumber = sc.nextLine();
		char[] idArr = new char[idNumber.length()];
        >>> 입력받은 값의 길이를 배열에 넣어 선언 및 할당
		
		for(int i = 0; i < idArr.length; i++) {
        >>> i는 idArr배열의 길이보다 -1인 만큼 증가
			idArr[i] = idNumber.charAt(i); 
		}
		
		char[] copy = new char[idArr.length];
        >>> idArr의 복사본 char[]에 뒤 6자리부터 *이 들어가게끔 깊은 복사 후 출력
		
		for(int i = 0; i < copy.length; i++) {
			
			if(i <= 7) { 			>>> 7번 인덱스 이하까지
				copy[i] = idArr[i]; >>> 기존의 주민번호를 복사하고,
			} else { 				>>> 그 이외는 *의 값으로 변환
				copy[i] = '*';
			}	
			System.out.print(copy[i]);
		}
	}
}

💬 Overall Comment

* 코드로 풀어내기 어려웠던 문항이었다. 처음에 주민등록번호의 자리수만큼의 배열을 선언하고, 그 배열의 
  인덱스에 주민등록번호를 쪼개어 넣어야하는 아이디어를 떠올리는데에 시간이 소요되었다. 또한 뒷자리에 
  '*'을 넣는 조건을 성립시키기 위해 깊은 복사를 활용했는데, 이는 검색을 통해 방법을 찾아내었다.

🧩 로또번호 생성기 만들기

💁‍ 6칸 짜리 정수 배열을 하나 생성하고 1부터 45까지의 중복되지 않는 난수를 발생시켜 각 인덱스에 대입한 뒤 오름차순 정렬하여 출력하세요.

package com.greedy.section01.array.level04.advanced;

import java.util.Arrays;

public class Application1 {
	
	public static void main(String[] args) {
		
		// 6자리 배열 생성
		int[] numberArr = new int[6];
		
		// numberArr에 랜덤값 1~45 대입 (인덱스는 0부터 시작하므로, i는 6미만)
		for(int i = 0; i < 6; i++) {
			numberArr[i] = (int)(Math.random() * 45) + 1;
			
			// 중복값 제거하기
			for(int j = 0; j < i; j++) {
				if(numberArr[i] == numberArr[j]) {
                >>> 현재 랜덤 값 numberArr[i]와 이전 인덱스의 값 numberArr[j]가 같다면 중복
					i--;
                    break;
				}
			}
		}
		System.out.println("이번주의 로또 당첨 번호는 ?!");
		
		// 오름차순 정렬하여 출력
		for(int i = 0; i < 6; i++) {
			Arrays.sort(numberArr);
			System.out.print(numberArr[i] + " ");
		}
		System.out.println("입니다 :)");
	}
}

💬 Overall Comment

* 중복값을 제거하는 과정 중, 처음에는 break를 입력하지않아도 올바르게 출력이 되어 코드를 완성했었으나, 
  선생님의 코드와 비교해보는 과정에서 break를 입력하신 것을 발견했다. 이 이유가 궁금하여 여쭤본 결과, 
  break를 사용하지 않아도 출력에는 문제가 없지만 없을 경우에는 중복되는 값을 찾아도 또 중복되는 값을
  찾으려는 불필요한 과정을 거치기 때문에 중복되는 값을 찾았다면 break로 멈추고 다음 인덱스로 넘어가게끔
  설계해두신 것이었다. 아무리 결과가 알맞게 출력 되었더라도 최대한 메모리의 남용을 방지하는 좋은 코드를 
  만들어야겠다고 생각한 계기가 된 문항이었다.

profile
Tiny little habits make me

0개의 댓글