ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 항해 99 5기 TIL_35
    항해 99 2022. 2. 13. 01:16

    ▶ Today I Learned

    <알고리즘>

     

    [조이스틱]

     

    소요시간: 1시간 25분 + 2시간

    해결여부: 미해결

    https://programmers.co.kr/learn/courses/30/lessons/42860

     

    /*
    조이스틱을 좌우로 움직이는 경우의 수를 따져 경우가 더 적은 쪽을 택하기
    (근데 이때 좌우의 경우는 문자열 내 A가 포함되어있는 경우만 따지면됨
    아닌 경우는 다 똑같음),
    그 다음 상하 움직이는 경우의 수를 따져 경우가 더 적은 쪽을 택하기
    맨 처음엔 A로만 이루어져 있습니다.
    첫 시작은 항상 첫번째
    */
    
    let name = "AAEE"
    let leftRight = 0
    //AJEARAO 이거에서 거꾸로 시작하는 건 마치
    // AOARAEJ와 같다
    // 그렇다면
    // 문자열 첫번째 문자를 제외하고 잘라낸 다음 그것을 배열로 쪼개 역순으로 뒤집고 이를 다시 합쳐주어 원래 문자에 더하자.
    let reversedName = name.substring(0,1) + name.substring(1).split('').reverse().join('')
    
    
    
    console.log(reversedName)
    
    //문자열 내 A가 포함되어 있는가? 그리고 문자중 하나라도 A가 아닌게 있는가?
    
    console.log(name.includes('A'));
    
    if(name.includes('A')) {
    // 좌우 경우의 수 따지기
    
    console.log(name.split('')) // "JERAOEN" 인 경우를 고려해보면 A가 중간에 있을 때 나눈 배열의 길이는 같지만 실제로 첫번째에서 마지막문자로 갈때의 횟수 1이 더해지므로 둘중 어떤 선택지가 나을지 비교할 때 [첫번째 배열 길이]와 [두번째 배열 길이 +1]을 비교해주어 더 큰쪽이 있다면 그쪽을 택해야 함
    console.log(reversedName.split(''))
    
    console.log(name.split('').lastIndexOf('A'))
    console.log(reversedName.split('').lastIndexOf('A'))// 인덱스가 더 큰쪽이 적게 감 -> 더 마지막 부분에 A가 있기 때문?
    // 하지만 "EEEAEAR"로 하게 되면 인덱스가 각각 5,4 이지만 횟수는 똑같아 fail
    // name이나 reversedName의 마지막 글자중 하나라도 A인 경우에는 위의 식이 성립, 아니라면 인덱스 번호가 어떻든 간에 결과는 같음
    
    if(name[name.length-1] === 'A' || reversedName[reversedName.length-1] === 'A') {
      if(name.split('').lastIndexOf('A') > reversedName.split('').lastIndexOf('A')) {
        
        // EERAEAA처럼 마지막에 A가 몰려있는 경우?는 어떻게 값을 반환하지?
        // 뒤집으면 AAEAREE E의 인덱스는 2
        // console.log(name.split('').reverse().reduce((a, b, curIndex) => {if(a === 'A' && b === a) {} else {return curIndex}})) // reduce 구문이 안 멈춘다..
    let i = 0
      while (i < name.length) {
        if(name.split('').reverse()[i] === 'A' && name.split('').reverse()[i] ===  name.split('').reverse()[i+1]) {
    
        } else {
    
          // 끝에서 A가 이어지다가 다른 문자가 나오는 인덱스를 찾아 반환
          console.log('정답', i+1)
          console.log(reversedName.length - 1 - (i + 1))
            // 네임 원래 순서대로, 즉, 오른쪽으로 가는 것
            leftRight = reversedName.length - 1 - (i + 1)
    
            break
          }
          i++
      };
    
        // EERAEAA에서 E의 인덱스는 4
    
      } else {
    
    // name.split('').lastIndexOf('A') <= reversedName.split('').lastIndexOf('A')
    let i = 0
      while (i < reversedName.length) {
        if(reversedName.split('')[i] === 'A' && reversedName.split('')[i] === reversedName.split('')[i+1]) {
    
        } else {
    
          // 끝에서 A가 이어지다가 다른 문자가 나오는 인덱스를 찾아 반환
          console.log('정답', i+1)
          console.log(reversedName.length - (i + 1))
            // 네임 원래 순서대로, 즉, 오른쪽으로 가는 것
            leftRight = reversedName.length - (i + 1)
            
            break
            
          }
          i++
        }
      }
    
    } else {
      // 둘다 A가 들어가있긴 하지만 그게 마지막 인덱스가 아니기 때문에
      // 어차피 마지막 까지 이동하여 글자를 바꾸어야 함 -> 어느 쪽으로 가도 좌우 이동 횟수는 같음
      leftRight = name.length - 1
    }
    
    } else {
      // 문자열 내 A가 없단 소리이므로 좌우 어디로 가도 좌우 이동 횟수는 똑같음, 따질 필요 없음
      leftRight = name.length - 1
    };
    
    console.log('최종 좌우 결과', leftRight)

     

    지난 번에 이어 열심히 짰지만 입력 값을 다양하게 바꾸던 도중

    좌우 이동 값이 원하는 대로 나오지 않는 것을 발견했다.

    오늘 피드백 타임이 있기 때문에 우선은 자고 일어나서 해결해보아야겠다.

     

    ▶ 느낀 점

     

    자기 전에 유튜브도 보고 6일 동안 밀려있던 잠을 일요일에 모두 잤더니 확실히 활용 시간은 평소에 비해 부족했다.

    그래도 잠은 꼭 필요한 것이니 잘 자주도록 하고, 되도록 자기 전에 유튜브는 보지 않도록 하자..!

     

     

    ▶ 공부 시 참고 링크들

     

    오늘은 특별히 존재하지 않는다 :3

     

     

     

    '항해 99' 카테고리의 다른 글

    항해 99 5기 TIL_36  (0) 2022.02.15
    항해 99 5기 WIL_5  (0) 2022.02.13
    항해 99 5기 TIL_34  (0) 2022.02.13
    항해 99 5기 TIL_33  (0) 2022.02.12
    항해 99 5기 TIL_32  (0) 2022.02.11
Designed by Tistory.