본문 바로가기

bitcamp/면접족보

면접족보 20/12/23_Stack, Queue, Map

1. "그만"이 입력될 때까지 나라 이름과 인구를 입력받아 저장하고,

     다시 나라 이름을 입력받아 인구를 출력하는 프로그램을 작성하라. 

 

· 참고

 

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 class Country {
    public static void main(String[] args) {
    HashMap<String, Integer> coummap = new HashMap<>();
    Scanner sc = new Scanner(System.in);
    String key;
                
    System.out.println("나라 이름과 인구를 입력하세요.(예: Korea 5000)");
    while(true) {
    key = sc.next();
    if(key.equals("그만")) {
        System.out.println();
        break;
    }
    Integer value = sc.nextInt();
    coummap.put(key, value);
    }
        
    while(true) {
    System.out.print("인구 검색>>");
    String word = sc.next();
    if(word.equals("그만")) {
        System.out.println("프로그램을 종료합니다.");
        break;
    }else if(coummap.containsKey(word)) {
        System.out.println(word + "의 인구는 " + coummap.get(word));
    }else
        System.out.println(word + " 나라는 없습니다.");    
    }sc.close();    
    }
}
cs

 

 

2. 학생 정보를 나타내는 Student 클래스에는 이름, 학과, 학번, 학점 평균을 저장하는 필드가 있다.

  학생마다 Student 객체를 생성하고 4명의 학생 정보를 ArrayList<Student> 컬렉션에 저장한 후,
  ArrayList<Student>의 모든 학생(4명) 정보를 출력하고, 
  학생 이름을 입력받아 해당 학생의 학점 평균을 출력하는 프로그램을 작성하라. 

 

· 참고

 

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 class Student{
    private String name, major, sNumber;
    private double grade;
    
    Student(String name, String major, String sNumber, double grade){
        this.name = name;
        this.major = major;
        this.sNumber = sNumber;
        this.grade = grade;
    }    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMajor() {
        return major;
    }
    public void setMajor(String major) {
        this.major = major;
    }
    public String getsNumber() {
        return sNumber;
    }
    public void setsNumber(String sNumber) {
        this.sNumber = sNumber;
    }
    public double getGrade() {
        return grade;
    }
    public void setGrade(double grade) {
        this.grade = grade;
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 class Studentmain {
    final static int STUDENT_NUM = 4
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try {
            ArrayList<Student> infoList = new ArrayList<Student>();
            System.out.println("학생 이름, 학과, 학번, 학점평균 입력하세요.");
        
            for(int i = 0; i < STUDENT_NUM; i++) {
                System.out.print(">> ");
                String text = sc.nextLine();
            
                StringTokenizer st = new StringTokenizer(text, ",");
                String name = st.nextToken().trim(); //trim은 중간에 공백이 있다면 삭제해라 라는 의미
                String major = st.nextToken().trim();
                String sNumber = st.nextToken().trim();
                double grade = Double.parseDouble(st.nextToken().trim());
            
                Student student = new Student(name, major, sNumber, grade);
                infoList.add(student);                
            }    
            Iterator<Student> it = infoList.iterator();
            while(it.hasNext()) {
                Student student = it.next();
                System.out.println("----------------");
                System.out.println("이름: " +student.getName());
                System.out.println("이름: " +student.getMajor());
                System.out.println("이름: " +student.getsNumber());
                System.out.println("이름: " +student.getGrade());
                System.out.println("----------------");
            }
        
            while(true) {
                System.out.print("학생 이름 >> ");
                String name = sc.nextLine();
            
                if(name.equals("그만"))
                    break;
            
                for(int i = 0; i < infoList.size(); i++) {
                    Student student = infoList.get(i);
                
                    if(student.getName().trim().equals(name.trim())) {
                        System.out.print(student.getName() + ", ");
                        System.out.print(student.getMajor() + ", ");
                        System.out.print(student.getsNumber() + ", ");
                        System.out.print(student.getGrade());
                        break;
                    }    
                  }
                }
            }catch(Exception e) {
                e.printStackTrace();
                System.out.println("프로그램이 에러입니다.");
            }
            System.out.println("프로그램이 종료 되었습니다.");
            sc.close();
    }
 }
cs

 

 

 

3. 2번 문제 ArrayList<Student>를, HashMap<String, Student>으로 이용하여 재작성하라. 

    단, 해시맵에서 키는 학생 이름으로 한다. 

 

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 class Studentmain {
    final static int STUDENT_NUM = 4
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try {
            HashMap<String, Student> infoMap = new HashMap<>();
            System.out.println("학생 이름, 학과, 학번, 학점평균 입력하세요.");
        
            for(int i = 0; i < STUDENT_NUM; i++) {
                System.out.print(">> ");
                String text = sc.nextLine();
            
                StringTokenizer st = new StringTokenizer(text, ",");
                String name = st.nextToken().trim(); //trim은 중간에 공백이 있다면 삭제해라 라는 의미
                String major = st.nextToken().trim();
                String sNumber = st.nextToken().trim();
                double grade = Double.parseDouble(st.nextToken().trim());
            
                Student student = new Student(name, major, sNumber, grade);
                infoMap.put(sNumber, student);                
            }    
        
            Set<String> key = infoMap.keySet();
            Iterator<String> it = key.iterator();
            while(it.hasNext()) {
                String sNum = it.next();
                Student student = infoMap.get(sNum);
                System.out.println("----------------");
                System.out.println("이름: " +student.getName());
                System.out.println("이름: " +student.getMajor());
                System.out.println("이름: " +student.getsNumber());
                System.out.println("이름: " +student.getGrade());
                System.out.println("----------------");
            }
        
            while(true) {
                System.out.print("학생 번호 >> ");
                String name = sc.nextLine();
            
                if(name.equals("그만"))
                    break;
                Student student = infoMap.get(name);
            
                if(student == null) {
                    System.out.println(name + "학생 없습니다.");
                }else {
                    System.out.print(student.getName() + ", ");
                    System.out.print(student.getMajor() + ", ");
                    System.out.print(student.getsNumber() + ", ");
                    System.out.print(student.getGrade());
                }    
    }
    }catch(Exception e) {
                e.printStackTrace();
                System.out.println("프로그램이 에러입니다.");
    }
    System.out.println("프로그램이 종료 되었습니다.");
    sc.close();
    }
 }
cs

 

 

4. 도시 이름, 위도, 경도 정보를 가진 Location 클래스를 작성하여라.

   도시 이름을 '키'로 하는 HashMap<String, Location> 컬렉션을 만들고, 사용자로부터 입력 받아 4개의 도시를 저장하라.

   그리고 도시 이름으로 검색하는 프로그램을 작성하라. 

 

· 참고

 

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
 class Location {
    private int longitude;
    private int latitude;
    
    Location(int longitude, int latitude){
        this.longitude = longitude;
        this.latitude = latitude;
    }
    public String toString() {
        return longitude + " " + latitude;
    }
 }
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 class Locationmain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        HashMap<String, Location> map = new HashMap<>();
        Location[] loca = new Location[4];
        String city = null;
                
        System.out.println("도시, 경도, 위도를 입력하세요.");
        for(int i = 0; i < loca.length; i++) {
            city = sc.next();
            int longitude = sc.nextInt();
            int latitude = sc.nextInt();
            loca[i] = new Location(longitude, latitude);
            map.put(city, loca[i]);    
        }    
        Set<String> ks = map.keySet();
 
        while(true) {
            System.out.print("도시 이름 >> " );
            String str = sc.next();
            
            if(str.equals("그만")) {
                System.out.println("종료합니다.");
                break;
            }
            for(String s : ks) {
        //   System.out.print(map.get(s).toString() + '\t');
 
                if(str.equals(s)) {
                    System.out.println(s + " " + map.get(s)); 
                    break;
                }else
                    continue;
            }
      }sc.close();
   }
 }
cs

 

 

5. 이름과 학점(4.5만점)을 5개 입력받아 해시맵에 저장하고, 장학생 선발 기준을 입력 받아 

   장학생 명단을 출력하라. [Hint] HashMap의 전체 요소를 검색하여 학점이 3.2 이상인 학생을 알아내야 한다.

 

· 참고

 

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 class Student{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);    
        HashMap<String, Double> map = new HashMap<>();
        
        System.out.println("미래장학금관리시스템입니다.");
        while(map.size() < 3) {
            System.out.print("이름과 학점 >> ");
            String name = sc.next();
            Double grade = sc.nextDouble();
            map.put(name, grade);
        }
            
        System.out.print("장학생 선발 학점 기준 입력>> ");
        double num = sc.nextDouble();
        Set<String> ks =  map.keySet();
        System.out.print("장학생 명단: ");
        for(String e : ks) {            
            if(map.get(e) >= num) {
                System.out.print(e + " ");
    }
 }
cs

 

 

6. 큐와 스택에 대하여 설명하시오. **필수**

· Stack은 LIFO(last - in - first - out)으로 먼저 저장된 데이터가 마지막에 출력되는 구조를 지닌다.

· Queue는 FIFO(first - in - first - out)으로 먼저 저장된 데이터가 먼저 출력되는 구조를 지닌다.

 offer 넣기(공간 부족 시 false 반환), poll 꺼내기(꺼낼 대상이 없다면 null 반환), peek 확인(확인할 대상이 없다면 null 반환) 



7. Map에 대하여 설명하시오.

· Map은 Key와 Value를 가지고 있으며, Key를 이용해 데이터를 탐색하여 Key에 해당되는 Value를 추출한다.

· HashMap<K , V>은 인터페이스를 구현하지 않기때문에, for-each문과 반복자를 통해 접근을 할 수 없다.
 대신 keySet 메소드를 호출하여 key를 모아, for-each문/ 반복자를 통해 접근할 수 있다. 

· 아래와 같이 사용되며, TreeMap의 경우는 정렬된 형태로 출력된다.

 

 

8. 아래의 TreeMap의 Value를 확인 하기 위한 소스를 짜시오. **필수**

· 참고

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 class Mapmain {
    public static void main(String[] args) {
     TreeMap<Integer, String> map = new TreeMap<>();
          map.put(45"Brown");
          map.put(37"James");
          map.put(23"Martin");
       
          Set<Integer> set = map.keySet();
          for(Iterator<Integer> itr = set.iterator(); itr.hasNext();) {        
           // 반복자 사용
               System.out.println(map.get(itr.next()));                            
          }
     }
 }

cs

 

 

9. 아래의 IntegerComparator를 내림차순 정렬이 되도록 구현하시오.

· 참고

 

· 작성

1
2
3
4
5
6
 class IntegerComparator implements Comparator<Integer>{
    @Override
    public int compare(Integer n1, Integer n2){
        return n2.intValue() - n1.intValue();
    }
 }
cs

 

 

10. Objects.hash의 용도와 사용법은?

· Objects.hash 메소드는 매개 값으로 주어진 값들을 이용하여 hashCode를 생성하고, 주어진 매개값들로 배열을 생성한다.

· Arrays.hashCode(Objects[])를 호출하여 hashCode를 통해 값을 리턴하고, 군집을 더 세밀하게 나누기 때문에 탐색 속도가 향상된다.

· ex) model과 color를 기반으로 hash 값을 리턴