-
항해 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