TIL)프로그래밍 기초_23.05.26

주민·2023년 5월 26일
0

TIL

목록 보기
7/84

어제 풀던 2주차 문제 풀었다! 이어서 TIL 작성하려 한다.

TIL 작성법(업데이트함!)
강의내용정리-2주차

문제

각 자료구조(List / Set / Map)를 입력 -> 요리제목 -> 레시피 -> 끝(종료)을 입력하면 아래와 같이 나오도록 하기
[List 요리제목]
1. 레시피


문제 풀기

  • swich문을 이용해 List / Set / Map 케이스를 하나씩 만들기
  • 정보를 입력받아야 하니 Scanner 사용
  • 값 넣기, 조회는 자료구조마다 조금씩 다르니 맞춰서 코드짤 것!

일단 swich문 밖에서 자료구조를 입력받고 그걸로 swich문 돌려준다.
그리고 반복문 써서 입력받아 리스트에 넣어주고 또 반복문으로 출력해주면 될 거 같다.


** 23.05.27 TIL 코드 => List case

ArrayList<String> strList = new ArrayList<>();
while (true) {
    String text = sc.nextLine();
    strList.add(text);
    if (text.equals("끝")) {
        break;
    }

}

System.out.println("[ " + data + " " + strList.get(0) + " ]");

for (int i = 1; i < strList.size(); i++) {
    System.out.println(i + ". " + strList.get(i));
}
break;

오류 & 해결
출력 글자 수를 맞췄음에도 "끝" 부분까지 출력이 된다. 처음 while문에서 입력을 하고 if문(break!)을 실행해서 "끝" 까지 추가된거 같다, 아래와 같이 위치를 바꾸니 해결됐다.

  while (true) {
      String text = sc.nextLine();
      if (text.equals("끝")) {
          break;
      }
  	  strList.add(text);

** Set case
List와 비슷한 방식으로 "음식 제목" 까지 리스트에 넣어 data와 합치는 방법을 사용했다. 그런데, 리스트에 처음으로 들어간 "음식 제목"을 가져올 수가 없다.
 Set<String> strSet = new HashSet<String>();
 System.out.println("[ " + data + " "); 
  
 for(String val :strSet ){
    if(val.contains("]")){
        System.out.println(val +" ]");
    }
    int num = 0;
    num++;
    System.out.println(num + " . "+val);
}

오류 & 해결
Set은 순서가 없어 0배열을 가져오기도 어려웠고 값 하나씩 직접 꺼낼 수가 없었다.(strSet[i] 이런 방법 불가) 그래서 음식제목을 titleSet으로 분리하고 출력하는 방법을 찾아 그걸로 바꿨다.

-> 순서대로 출력 : Iterator iterator = strSet.iterator();

    String titleSet = sc.nextLine();

      -- 입력 반복문 -- 

    System.out.println("[ " + data + " " + titleSet + " ]");

   // hashSet출력 위함
    Iterator iterator = strSet.iterator();

    for (int i = 0; i < strSet.size() - 1; i++) {
        System.out.println(i + 1 + " . " + iterator.next());
    }
                                     

** Map case
출력하는 부분은 Set과 동일하게 진행했다. 그런데 hashMap의 경우 key와 value 값이 따로 있어 number 값을 따로 선언하고 1씩 증가시켜 key 값으로 사용했다.
  Map<Integer, String> strMap = new HashMap<>();

  // num의 값이 증가하지 않아 끝만 나옴
  while (true) {
      String text = sc.nextLine();
	  int num =0;
	  num++;
      strMap.put(num, text);
      if (text.equals("끝")) {
          break;
      }
  }
  System.out.println("[ " + data + " " + titleMap + " ]");

  for (int i = 1; i < strMap.size(); i++) {
      System.out.println(i + " . " + strMap.get(i));
  }

오류 & 해결
num의 값이 증가하지 않아 마지막에 입력한 text만 나오는 문제가 생겼다.
적용안된 사유는 따로 확인해보고 우선 put안에서 ++가 들어가도록 수정했다.

-> 반복문 안에 선언과 ++를 같이해서 계속 1이 나온거였다,너무 당연한 내용이라 당황스럽다.

  int number = 1;
  
  while (true) {
      String text = sc.nextLine();
      strMap.put(number++, text);
      if (text.equals("끝")) {
          break;
      }
  }
  
 or
 
   int number = 0;
  
  while (true) {
      String text = sc.nextLine();
      number++;
      strMap.put(number, text);
      if (text.equals("끝")) {
          break;
      }
  }

알게된 점

  1. 기본적으로 코드는 위 -> 아래로 진행되기 때문에 이 부분은 참고해서 코드 짤 것
  2. Iterator iterator = strSet.iterator();
    -> 참고 블로그1
    -> 참고 블로그2
    -> Set은 순서가 없기 때문에 인덱스로 가져올 수가 없어 Iterator를 통해 가져와야 한다.
    -> strSet의 값을 Iterator로 선언한 변수 안에 넣고 변수.next()로 뽑아내는 방식으로 데이터가 없어질 때까지 뽑아낸다, 순서가 없어 들어간 순서대로 나오도록 정해진 건 아니지만 대부분 맞춰 나온다고 한다.
  3. 반복문 안에 초기화를 하고 값을 더하면 값이 늘어나지 않는다.
    만약 반복문 안에 증가해야하는 값을 넣어야 한다면 밖에서 선언&초기화를 하면 된다.
    ** Iterator 반복문 예시
  //hasNext : iterator가 값을 뺴오는데 남은 값이 있으면 true 없으면 false를 출력
  while(iterator.hasNext()) {
      System.out.println(a + " . " + iterator.next());
      b++;
  }

0개의 댓글

관련 채용 정보