TIL 240620

인자약·2024년 6월 20일

TIL

목록 보기
13/14

iterator 디자인 패턴에 제네릭 적용

package iterator.generic;

public interface Container<T> {
	Iterator<T> getIterator();
}
package iterator.generic;

public interface Iterator<T> {
	boolean hasNext();
	T next();
}
package iterator.generic;

public class ContainerImpl<T> implements Container<T> {

//	String[] strArray = {"Hello", "Iterator", "Pattern"};
	T[] array;
	
	public void setArray(T[] array) {
		this.array = array;
	}
	
	@Override
	public Iterator<T> getIterator() {
		// Iterator interface 를 구현한 객체를 return
		return new IteratorImpl();
	}

	private class IteratorImpl implements Iterator<T> {

		int index; // default 0
		
		@Override
		public boolean hasNext() {
			if (index < array.length) return true;
			return false;
		}

		@Override
		public T next() {
			if (this.hasNext()) return array[index++];
			return null;
		}
		
	}
}
package iterator.generic;

public class Test {

	public static void main(String[] args) {
		ContainerImpl<String> container = new ContainerImpl<>();
		String[] strArray = {"Hello", "Iterator", "Pattern"};
		container.setArray(strArray);
		
		Iterator<String> iter = container.getIterator();
		while (iter.hasNext()) {
			System.out.println(iter.next());
		}
		
		ContainerImpl<Integer> container2 = new ContainerImpl<>();
		Integer[] intArray = {1, 3, 4, 6, 7,};
		container2.setArray(intArray);
		
		Iterator<Integer> iter2 = container2.getIterator();
		while (iter2.hasNext()) {
			System.out.println(iter2.next());
		}
		
	}

}

별 찍기

package basic.star;

public class Star1 {

	public static void main(String[] args) {
		// 반복문 + 출력
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 5; j++) {
				if (j < i) {
					System.out.print(" ");
				} else {
					System.out.print("*");
				}
			}
			System.out.println();
		}

	}

}
package basic.star;

public class Star2 {

	public static void main(String[] args) {
		// 반복문 + 출력 + 반전 시점
		// 반전 : 정확히 반인 곳에서 공백 기준으로 점점 증가? 점점 감소? 판단 <= 밑으로 가면서
		// 옆으로(열) 가면서 공백 출력 나머지 조건 (전체 7 중 공백 뺀 만큼)
		
		int turnCnt = 7  / 2; // 3.5 x 3 으로 정수 처리
		int spaceCnt = 0;
		boolean spaceIncrease = true; // 공백문자 수 증가?? 감소??
		
		for (int i = 0; i < 7; i++) {
			// 1. 출력하지 않을 부분까지 따진다.
//			for (int j = 0; j < 7; j++) {
//				if (j < spaceCnt) {
//					System.out.print(" ");
//				} else if (j < 7 - spaceCnt) {
//					System.out.print("*");
//				}
//			}
			
			// 2. 출력할 부분까지만 따진다.
//			for (int j = 0; j < 7 - spaceCnt; j++) {
//				if (j < spaceCnt) {
//					System.out.print(" ");
//				} else {
//					System.out.print("*");
//				}
//			}
			
			// 3. 앞 공백, 뒤 별 출력 순서가 명백하므로 for 문 분리해서 if 조건 체크 제거
			for (int j = 0; j < spaceCnt; j++) {
				System.out.print(" ");
				
			}
			for (int j = spaceCnt; j < 7 - spaceCnt; j++) {
				System.out.print("*");
			}
			
			System.out.println();
			// 행 별 출력이 완료 => 공백 증가 감소 판단
			if (spaceIncrease) {
				spaceCnt++;
			} else {
				spaceCnt--;
			}
			
			if (spaceCnt == turnCnt) { // 다음 행부터 감소로 변경
				spaceIncrease = false;
			}
		}
		
		// 나의 풀이
//		int n = 7;
//		int mid = n / 2;
//		
//		for (int i = 0; i <= n / 2; i++) {
//			for (int j = 0; j < i; j++) {
//				System.out.print(" ");
//			}
//			for (int k = 0; k < n - 2 * i; k++) {
//				System.out.print("*");
//			}
//			System.out.println();
//		}
//		for (int i = mid - 1; i >= 0; i--) {
//            for (int j = 0; j < i; j++) {
//                System.out.print(" ");
//            }
//            for (int k = 0; k < n - 2 * i; k++) {
//                System.out.print("*");
//            }
//            System.out.println();
//        }
	}
	
}

input

Scanner

package basic.input;

import java.util.Arrays;
import java.util.Scanner;

//Scanner : 편하다. 다소 무겁다.
public class ScannerTest {

	public static void main(String[] args) {
		// 1 2 3 4 5
//		{
//			Scanner sc = new Scanner(System.in);
//			int[] input = new int[5];
//			
//			for (int i = 0; i < 5; i++) {
//				input[i] = sc.nextInt();
//			}
//			
////			for (int i = 0; i < 5; i++) {
////				System.out.println(input[i]);
////			}
//			System.out.println(Arrays.toString(input));
////			sc.close();
//		}
		
		// 1 A 3 B 5
//		{
//			Scanner sc = new Scanner(System.in);
//			char[] input = new char[5];
//					
//			for (int i = 0; i < 5; i++) {
//				input[i] = sc.next().charAt(0); // "1", "2" ...
//			}
//					
//			System.out.println(Arrays.toString(input));
//		}
		
		// XYZQU
//		{
//			Scanner sc = new Scanner(System.in);
//			char[] input = sc.nextLine().toCharArray();; // "XYZQU" -> ['X', 'Y',..]
//					
//			System.out.println(Arrays.toString(input));
//		}
		
/*
6
1 2 3 4 5 1		 
 */
//		{
//			Scanner sc = new Scanner(System.in);
//			int N = sc.nextInt();
//			int[] input = new int[N];
//			
//			for (int i = 0; i < N; i++) {
//				input[i] = sc.nextInt();
//			}
//			System.out.println(Arrays.toString(input));
//		}
		
/*
5
XYZQU		
 */
		{
			Scanner sc = new Scanner(System.in);
			int N = sc.nextInt();
			sc.nextLine(); // 남아 있는 빈 개행문자('\n')를 처리
	//		int[] input = new int[N]; // 낭비
			char[] input = sc.nextLine().toCharArray();; // "XYZQU" -> ['X', 'Y',..]
					
			System.out.println(Arrays.toString(input));
		}

	}

}

BufferedReader

package basic.input;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BufferedReaderTest {

	public static void main(String[] args) throws Exception {
		// 1 2 3 4 5
//		{
//			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//			String str = br.readLine();
//			// 문자열을 전달해서 StringTokenizer 가 개별 문자열로 쪼갤 준비를 하게 된다.
//			StringTokenizer st = new StringTokenizer(str); 
//			
//			int[] input = new int[5];
//			for (int i = 0; i < 5; i++) {
//				input[i] = Integer.parseInt(st.nextToken()); // "1" -> 1, "2" -> 2...
//			}
//			System.out.println(Arrays.toString(input));
//		}
		
		// 1 A 3 B 5
//		{
//			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//			String str = br.readLine();
//			// 문자열을 전달해서 StringTokenizer 가 개별 문자열로 쪼갤 준비를 하게 된다.
//			StringTokenizer st = new StringTokenizer(str); 
//			
//			char[] input = new char[5];
//			for (int i = 0; i < 5; i++) {
//				input[i] = st.nextToken().charAt(0); // "1" -> '1', "2" -> '2'...
//			}
//			System.out.println(Arrays.toString(input));
//		}
		
		// XYZQU
//		{
//			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
////			String str = br.readLine();
////			char[] input = str.toCharArray();
//			char[] input = br.readLine().toCharArray();
//			
//			System.out.println(Arrays.toString(input));
//		}
		
/*
6
1 2 3 4 5 1
 */
		
//		{
//			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//			int N = Integer.parseInt(br.readLine());
//			int[] input = new int[N];
//			StringTokenizer st = new StringTokenizer(br.readLine());
//			
//			for (int i = 0; i < N; i++) {
//				input[i] = Integer.parseInt(st.nextToken()); 
//			}
//			
//			System.out.println(Arrays.toString(input));
//		}
		
/*
5
XYZQU		
*/		
//		{
//			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//			int N = Integer.parseInt(br.readLine()); // N
//			char[] input = br.readLine().toCharArray();
//			
//			System.out.println(Arrays.toString(input));
//		}

		
/*
5
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5		
 */
//		{
//			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//			int N = Integer.parseInt(br.readLine());
//			System.out.println(N);
//			
//			int[][] input = new int[N][N];
//			for (int i = 0; i < N; i++) { // 행
//				StringTokenizer st = new StringTokenizer(br.readLine());
//				for (int j = 0; j < N; j++) { // 열
//					input[i][j] = Integer.parseInt(st.nextToken());
//				}
//			}
//			for (int i = 0; i < N ; i++) {
//				System.out.println(Arrays.toString(input[i])); 
//			}	
//		}
		
/*
3 5
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5		
 */
		
//		{
//			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//			StringTokenizer st = new StringTokenizer(br.readLine()); // "3 5"
//			int N = Integer.parseInt(st.nextToken()); // 3
//			int M = Integer.parseInt(st.nextToken()); // 5
//			
//			System.out.println(N);
//			
//			int[][] input = new int[N][M];
//			
//			for (int i = 0; i < N; i++) { // 행
//				st = new StringTokenizer(br.readLine());
//				for (int j = 0; j < M; j++) { // 열
//					input[i][j] = Integer.parseInt(st.nextToken());
//				}
//			}
//			for (int i = 0; i < N ; i++) {
//				System.out.println(Arrays.toString(input[i])); 
//			}	
//		}
		
/* 첫 줄에 테스트 케이스 개수 (3), 둘째줄부터 테스트케이스, 각 테스트케이스는 첫 줄에 N, M, 이어지는 N개의 줄에 M개의 수가 주어진다.
 * 삼성 준비하려면 알아야 한다. 
3
2 2
1 2
6 7
3 5
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
2 1
8
9

 */
		{
			// 1. 디버거를 적극적으로 활용하자.
			// 2. 파일 입력을 적극적으로 활용하자.
			System.setIn(new FileInputStream("input.txt"));
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			int T = Integer.parseInt(br.readLine());
			
			for (int t = 1; t <= T; t++) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				int N = Integer.parseInt(st.nextToken());
				int M = Integer.parseInt(st.nextToken());
				
				int[][] input = new int[N][M];
				
				for (int i = 0; i < N; i++) {
					st = new StringTokenizer(br.readLine());
					for (int j = 0; j < M; j++) {
						input[i][j] = Integer.parseInt(st.nextToken());
					}
				}
				// 출력
				System.out.println(t);
				for (int i = 0; i < N; i++) {
					System.out.println(Arrays.toString(input[i]));
				}
			}
		}
	}

}

Array

Basic

package basic.array;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Array_01_Basic {

	public static void main(String[] args) {
		// "abbcccddddeeeeeffffggghhiabbcccddddeeeeeffffggghhi"
		// 위 문자열 중 각 알파벳 문자의 사용 횟수 (빈도수)
		// a ~ z 까지 모든 알파벳의 사용 횟수를 출력하세요.
		// 변수 26개, 26가지의 경우 처리??
//		int[] alphaCnt = new int[26]; // alphaCnt[0] = a, alphaCnt[1] = b,....
//		String str = "abbcccddddeeeeeffffggghhiabbcccddddeeeeeffffggghhi";
//		int strLen = str.length();
//		for (int i = 0; i < strLen; i++) {
//			alphaCnt[str.charAt(i) - 'a']++;
//		}
//		
//		for (int i = 0; i < 26; i++) {
//			System.out.println((char) (i + 'a') + " " + alphaCnt[i]);
//		}
		
		// 배열의 맨 앞부터 각 3리씩 일정한 규칙이 있다. 앞 * 중 = 뒤
		// 규칙에 위반되는 쌍이 몇 개인지 출력
//		{
//			int[] intArray = {3,2,6, 3,4,4, 1,4,2, 2,3,6, 1,3,5, 1,5,1, 1,1,1, 2,4,2, 2,2,4};
//			
//			int wrongCnt = 0;
//			int intLength = intArray.length - 2;
//			
//			for (int i = 0; i < intLength; i = i + 3) {
//				// i, i+1, i+2 세 항목 따진다.
//				if (intArray[i] * intArray[i + 1] != intArray[i + 2]) wrongCnt++;
//			}
//			System.out.println(wrongCnt);
//		}
		
		// "XYZEBFFGQOVVPWGFFCEAYX"
		// -->                    <--
		// 좌우 비대칭 문자가 있으면 출력, 전체 비대칭 문자가 몇 개인지 출력
		// 문자열의 길이는 짝수 보장
		{
			String str = "XYZEBFFGQOVVPWGFFCEAYX";
			char[] chArray = str.toCharArray();
			int wrongCnt = 0;
			int center = chArray.length / 2;
			
			for (int l = 0, r = chArray.length - 1; l < center; l++, r--) {
				if (chArray[l] != chArray[r]) {
					System.out.println(chArray[l] + " " + chArray[r]);
					wrongCnt++;
				}
			}
			System.out.println(wrongCnt);
		}
		
	}

}

Circular

package basic.array;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Array_02_Circular {

	public static void main(String[] args) {
		char[] input = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
		int n = input.length;
		
//		for (int i = 0; i < n; i++) {
//			System.out.print(input[i]);
//		}
		
		// 예외 발생
//		for (int i = 0; i < n * 2; i++) {
//			System.out.print(input[i]);
//		}
//		System.out.println();
		
//		for (int i = 0; i < n * 2; i++) {
//			System.out.print(input[i % n]);
//		}
//		System.out.println();
		
		// 반복 횟수를 정확히 알 수 없을 때
		int count = 0;
		int finish = 20;
		int i = 0;
		while(true) {
			if (count == finish) break;
			System.out.print(input[i % n]);
			count++;
			i++;
		}
	}

}
profile
인자약velog

0개의 댓글