이코테 구현 파트
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
int x = input.charAt(0) - 96;
int y = Integer.parseInt(input.substring(1));
int count = 0;
int[] xMove = {x + 2, x - 2, x + 1, x - 1};
int[] yMove = {y + 1, y - 1, y + 2, y - 2};
// 8가지 경우를 다 적는건가..?
if ((xMove[0] > 0 && xMove[0] < 9)) {
if (yMove[0] > 0 && yMove[0] < 9) count++;
if (yMove[1] > 0 && yMove[1] < 9) count++;
}
if ((xMove[1] > 0 && xMove[1] < 9)) {
if (yMove[0] > 0 && yMove[0] < 9) count++;
if (yMove[1] > 0 && yMove[1] < 9) count++;
}
if ((xMove[2] > 0 && xMove[2] < 9)) {
if (yMove[2] > 0 && yMove[2] < 9) count++;
if (yMove[3] > 0 && yMove[3] < 9) count++;
}
if ((xMove[3] > 0 && xMove[3] < 9)) {
if (yMove[2] > 0 && yMove[2] < 9) count++;
if (yMove[3] > 0 && yMove[3] < 9) count++;
}
System.out.println(count);
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
int row = input.charAt(1) - '0';
int column = input.charAt(0) - 'a' + 1;
// 나이트가 이동할 수 있는 8가지 방향
int[] dx = {-2, -1, 1, 2, 2, 1, -1, -2};
int[] dy = {-1, -2, -2, -1, 1, 2, 2, 1};
int count = 0;
for (int i = 0; i < 8; i++) {
int nextRow = row + dx[i];
int nextColumn = column + dy[i];
if (nextRow > 0 && nextRow < 9 && nextColumn > 0 && nextColumn < 9){
count++;
}
}
System.out.println(count);
char형을 숫자로
String input = sc.nextLine();
int row = input.charAt(1) - '0';
int column = input.charAt(0) - 'a' + 1;
자바의 정석 11장 컬렉션 프레임웍
Set인터페이스를 구현한 가장 대표적인 컬렉션
순서x, 중복x
HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인한다.
저장순서를 유지하고 싶다면 LinkedHashSet 이용
생성자 HashSet(int initialCapacity, float loadFactor)
loadFactor : 저장공간이 가득 차기 전에 공간을 확보하는 것
0.8로 지정하면 80%가 채워졌을때 용량을 두배로 늘린다.
default값은 0.75임
예제1
public class HashSetEx1 {
public static void main(String[] args) {
Object[] objArr = {"1", new Integer(1), "2", "2", "3", "3", "4", "4"};
Set set = new HashSet();
for(int i = 0; i < objArr.length; i++){
set.add(objArr[i]);
}
System.out.println(set);
}
}
</> 실행 결과
[1, 1, 2, 3, 4]
예제2 - HashSet에 add로 객체를 넣어줄 때 HeshSet의 특성상 중복된 객체가 있는지 확인해주는 절차를 거쳐야한다. 이때 equals()와 hashCode()를 호출해준다. 따라서 해당 객체의 클래스에 equals()와 hashCode()를 오버라이딩 해주어야한다!!! (635p)
public class HashSetEx3 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("abc");
set.add("abc");
set.add(new Person("David", 10));
set.add(new Person("David", 10));
System.out.println(set);
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name + " : " + age;
}
}
</> 실행 결과
[David : 10, abc, David : 10]
실행 결과를 보면 중복된 Person객체가 들어간 것을 볼 수 있다.
→ 아래와 같이 Person클래스에 equals()와 hashCode()를 오버라이딩 해야한다.
public class HashSetEx3 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("abc");
set.add("abc");
set.add(new Person("David", 10));
set.add(new Person("David", 10));
System.out.println(set);
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name + " : " + age;
}
@Override
public boolean equals(Object o) {
if(o instanceof Person) {
Person tmp = (Person) o; // 형변환 꼭 해주어야함
return this.name.equals(tmp.name) && this.age == tmp.age;
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
equals()에서 o를 Person 타입으로 형변환 해주어야한다. o라는 리모콘에는 name과 age과 없기 때문에 name과 age에 접근하기 위해서 Person타입으로 바꾸어줘야한다.
hashCode()
Generate 단축키 : command + n
예제3-HashSet의 교집합, 합집합, 차집합 구하기
밑에 코드는 예제여서 연습해본것이고 원래 HashSet에 있는 메서드를 쓰면 된다.
합집합(addAll), 교집합(retainAll), 차집합(removeAll)
public class HashSetEx5 {
public static void main(String[] args) {
HashSet setA = new HashSet();
HashSet setB = new HashSet();
HashSet setHab = new HashSet();
HashSet setKyo = new HashSet();
HashSet setCha = new HashSet();
setA.add("1");
setA.add("2");
setA.add("3");
setA.add("4");
setA.add("5");
System.out.println("A : " + setA);
setB.add("4");
setB.add("5");
setB.add("6");
setB.add("7");
setB.add("8");
System.out.println("B : " + setB);
// 교집합
Iterator it = setB.iterator();
while (it.hasNext()) {
Object tmp = it.next();
if (setA.contains(tmp)) setKyo.add(tmp);
}
System.out.println("교집합 : " + setKyo);
// 차집합
it = setA.iterator();
while (it.hasNext()) {
Object tmp = it.next();
if (!setB.contains(tmp)) setCha.add(tmp);
}
System.out.println("A - B 차집합 : " + setCha);
// 합집합
it = setA.iterator();
while (it.hasNext()) {
setHab.add(it.next());
}
it = setB.iterator();
while (it.hasNext()) {
setHab.add(it.next());
}
System.out.println("합집합 : " + setHab);
}
}
</> 실행 결과
A : [1, 2, 3, 4, 5]
B : [4, 5, 6, 7, 8]
교집합 : [4, 5]
A - B 차집합 : [1, 2, 3]
합집합 : [1, 2, 3, 4, 5, 6, 7, 8]