[C언어] BaekJun Algorithm Problem 1331
by RileyKim
(C언어) 백준 알고리즘 문제 1331번 나이트투어
2022.08.15 왜 두번쨰 문자 입력부터 쓰레기 값(?)이 포함되어 들어오는지 모르겠음… 이유 아시는 분은 댓글로 좀 알려주세요..ㅠㅠ 아무래도 다른 방법을 찾아봐야할 것 같음…
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
bool flag = true;
bool panel[6][6];
memset(panel, false, sizeof(panel));
char start[2];
char now[2];
char prev[2];
printf("start\n");
scanf("%c%c" ,&start[0],&start[1]);
start[0] = start[0] -'@';
start[1] = start[1] -'0';
prev[0] = start[0];
prev[1] = start[1];
printf("%d\n",start[0]);
printf("%d\n",start[1]);
while(true){
scanf("%c%c", &now[0], &now[1]);
now[0] -= '@';
now[1] -= '0';
if( panel[now[0]][now[1]] == false &&(abs(prev[0]-now[0]) == 2 && abs(prev[1]-now[1] == 1)) || (abs(prev[0]-now[0]) == 1 && abs(prev[1]-now[1] == 2))){
panel[now[0]][now[1]] = true;
prev[0] = now[0];
prev[1] = now[1];
}else{
flag = false;
}
}
if(flag){
printf("Valid");
}else{
printf("Invalid");
}
}
업데이트 2022.08.18
일단 문제는 풀었다..
이해 안가는 부분이 있어서 몇 일동안 계속 헤맸다…
결론은 아직도 이해가 안간다는 것이다…
밑에 2코드를 보자..
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
int main(void)
{
bool flag = true;
char xpos[36] = {};
int ypos[36] = {};
for(int i =0; i < 36; i++){
//문제의 코드, 왜 스페이스가 있고 없고에 정답, 오답이 되는지 이해가 아직도 되지않는다
scanf("%c%1d", &xpos[i], &ypos[i]);
if(i!=0){
//i=35가 되기전 정상적으로 이동하는지 확인한다.
if((xpos[i-1]+2) == xpos[i] || (xpos[i-1]-2) == xpos[i]){
if((ypos[i-1]+1) == ypos[i] || (ypos[i-1]-1) == ypos[i]){
flag = true;
}
else{
flag = false;
break;
}
}else if((xpos[i-1]+1) == xpos[i] || (xpos[i-1]-1) == xpos[i]){
if((ypos[i-1]+2) == ypos[i] || (ypos[i-1]-2) == ypos[i]){
flag = true;
}
else{
flag = false;
break;
}
}else{
flag = false;
break;
}
}
//마지막 횟차(i ==35) 에 초기값으로 갈 수 있는지 없는지 확인한다.
if(i == 35){
if((xpos[i]+2) == xpos[0] || (xpos[i]-2) == xpos[0]){
if((ypos[i]+1) == ypos[0] || (ypos[i]-1) == ypos[0]){
flag = true;
}
else{
flag = false;
break;
}
}else if((xpos[i]+1) == xpos[0] || (xpos[i]-1) == xpos[0]){
if((ypos[i]+2) == ypos[0] || (ypos[i]-2) == ypos[0]){
flag = true;
}
else{
flag = false;
break;
}
}else{
flag = false;
}
}
//이전에 입력된 값이 들어오는 지 for문을 통해 확인한다
for(int j=0; j<i; j++){
if(xpos[j]==xpos[i] && ypos[j]==ypos[i]){
flag = false;
break;
}
}
if(!flag)
break;
}
if(flag){
printf("Valid");
}else{
printf("Invalid");
}
}
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
int main(void)
{
bool flag = true;
char xpos[36] = {};
int ypos[36] = {};
for(int i =0; i < 36; i++){
//문제의 코드, 왜 스페이스가 있고 없고에 정답, 오답이 되는지 이해가 아직도 되지않는다
scanf(" %c%1d", &xpos[i], &ypos[i]);
if(i!=0){
//i=35가 되기전 정상적으로 이동하는지 확인한다.
if((xpos[i-1]+2) == xpos[i] || (xpos[i-1]-2) == xpos[i]){
if((ypos[i-1]+1) == ypos[i] || (ypos[i-1]-1) == ypos[i]){
flag = true;
}
else{
flag = false;
break;
}
}else if((xpos[i-1]+1) == xpos[i] || (xpos[i-1]-1) == xpos[i]){
if((ypos[i-1]+2) == ypos[i] || (ypos[i-1]-2) == ypos[i]){
flag = true;
}
else{
flag = false;
break;
}
}else{
flag = false;
break;
}
}
//마지막 횟차(i ==35)에 초기값으로 갈 수 있는지 없는지 확인한다.
if(i == 35){
if((xpos[i]+2) == xpos[0] || (xpos[i]-2) == xpos[0]){
if((ypos[i]+1) == ypos[0] || (ypos[i]-1) == ypos[0]){
flag = true;
}
else{
flag = false;
break;
}
}else if((xpos[i]+1) == xpos[0] || (xpos[i]-1) == xpos[0]){
if((ypos[i]+2) == ypos[0] || (ypos[i]-2) == ypos[0]){
flag = true;
}
else{
flag = false;
break;
}
}else{
flag = false;
}
}
//이전에 입력된 값이 들어오는 지 for문을 통해 확인한다
for(int j=0; j<i; j++){
if(xpos[j]==xpos[i] && ypos[j]==ypos[i]){
flag = false;
break;
}
}
if(!flag)
break;
}
if(flag){
printf("Valid");
}else{
printf("Invalid");
}
}
뭐가 정답일까…
답은 두번째이다…
단지
scanf(" %c%1d", &xpos[i], &ypos[i]);
scanf에서 “ 후에 스페이스를 안넣어서…
과연 그게 결과값에 차이를 줄까…
아무리 이해할려고 해도 저 스페이스 하나 차이로 정답, 오답이 구분되는 게 이해가 가질 않는다…
누군가 아신다면 댓글로 알려주시면 감사하겠습니다…
만약 실제 결과에 차이가 없는 코드이고 스페이스때문에 오답을 처리한다면…정말 짜증날 것 같다…
2022.08.19
ypos의 타입을 char로 변경하고, scanf에서 %c로 입력받게 수정하여도 정답입니다!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
#include <stdbool.h> | |
#include <stdlib.h> | |
int main(void) | |
{ | |
bool flag = true; | |
char xpos[36] = {}; | |
char ypos[36] = {}; | |
for(int i =0; i < 36; i++){ | |
scanf(" %c%c", &xpos[i], &ypos[i]); | |
if(i!=0){ | |
if((xpos[i-1]+2) == xpos[i] || (xpos[i-1]-2) == xpos[i]){ | |
if((ypos[i-1]+1) == ypos[i] || (ypos[i-1]-1) == ypos[i]){ | |
flag = true; | |
} | |
else{ | |
flag = false; | |
break; | |
} | |
}else if((xpos[i-1]+1) == xpos[i] || (xpos[i-1]-1) == xpos[i]){ | |
if((ypos[i-1]+2) == ypos[i] || (ypos[i-1]-2) == ypos[i]){ | |
flag = true; | |
} | |
else{ | |
flag = false; | |
break; | |
} | |
}else{ | |
flag = false; | |
break; | |
} | |
} | |
// printf("%d",i); | |
if(i == 35){ | |
if((xpos[i]+2) == xpos[0] || (xpos[i]-2) == xpos[0]){ | |
if((ypos[i]+1) == ypos[0] || (ypos[i]-1) == ypos[0]){ | |
flag = true; | |
} | |
else{ | |
flag = false; | |
break; | |
} | |
}else if((xpos[i]+1) == xpos[0] || (xpos[i]-1) == xpos[0]){ | |
if((ypos[i]+2) == ypos[0] || (ypos[i]-2) == ypos[0]){ | |
flag = true; | |
} | |
else{ | |
flag = false; | |
break; | |
} | |
}else{ | |
flag = false; | |
} | |
} | |
for(int j=0; j<i; j++){ | |
if(xpos[j]==xpos[i] && ypos[j]==ypos[i]){ | |
flag = false; | |
break; | |
} | |
} | |
if(!flag) | |
break; | |
} | |
if(flag){ | |
printf("Valid"); | |
}else{ | |
printf("Invalid"); | |
} | |
} |
Subscribe via RSS